2013-03-24 34 views
1

我在C++中使用外部C库(libsvm)。我在我的类头文件中插入头文件使用使用指向类内结构的指针

extern "C"{ 
#include "svm.h" 
} 

此库包含一个名为svm_model的结构。它还包含一个函数,该函数给出它为struct svm_model分配的一些输入参数(malloc)空间并返回一个指向它的指针。功能是

svm_model *svm_train(input_parameters) 

在我的代码(在C++)创建在我的类中的变量,它是一个结构svm_model指针。在我的头文件我做

class myClass 
{ 
public: 
    int do_something(); 
private: 
    struct svm_model *m_data; 
} 

内部“do_something()”我已经成功调用下列方式svm_train:

struct svm_model *test = svm_train(input_parameters); 

但每当我想写的结果为M_DATA,我得到一个分段故障。发生这种情况的

m_data = svm_train(input_parameters); 

,但如果我这样做

struct svm_model *test = svm_train(input_parameters); 
m_data = test; 

其实也正好,我注意到,即使我做

printf("hello: %p\n", m_data); 

它还崩溃。因此,我怀疑在类中使用指向结构(已在别处定义)的指针时存在问题,尽管我没有在任何地方找到任何提示。我尝试在我的类构造函数中将它初始化为NULL,但不会更改任何内容。

任何帮助表示赞赏。

+2

你确定你使用的函数分配内存吗? – Alon 2013-03-24 16:25:58

+2

你可以创建一个[SSCCE](http://sscce.org/)吗? – 2013-03-24 16:27:47

+0

我不知道这个问题是什么,但是这个'因此我怀疑在一个类中使用一个指向结构体的指针(在其他地方已经定义了)“是错误的。如果属实的话,C++将会非常无用。 – john 2013-03-24 16:43:04

回答

0

那么,就发现了这个问题,它确实比其他地方报道。 发生了什么事,是我创造了myClass的的STL载体,并获取此类向量的第一个元素的方法,尽管我并没有明确创建它,即:

std::vector<myClass> dummy; 
dummy[0].do_something(); 

鉴于一切都正确编译我不认为这部分代码可能会导致问题。

谢谢大家的帮助。

6

如果它只是

printf ("hello: %p\n", (void*)m_data); 

崩溃那么很可能这个问题是其他地方了。它看起来像当你打电话printf函数this是无效的(或许NULL?)或你的内存堆的形状非常糟糕。

在Linux上,我建议用g++ -Wall -g用最近的编译器编译(GCC 4.8刚刚发布)。改进代码直到没有警告。然后使用gdbvalgrind进行更多调试。

您可能还想编译您的libsvm带有调试信息和所有警告(或简单地使用该包的调试变体)。

1

文件svm.h已经有

extern "C" { 

声明。因此,而不是:

extern "C"{ 
#include "svm.h" 
} 

简单地做:

#include "svm.h" 

也没有必要一次又一次地重复结构关键词。因此,而不是:

struct svm_model *m_data; 

做:

svm_model *m_data; 
+1

这是真的,但这对bug没有帮助。您的提案纯粹是语法的(但出于可读性原因仍然有用)。它不应该显着改变编译器生成的代码。 – 2013-03-24 16:41:47