使用指向类内部结构的指针

时间:2013-03-24 16:22:09

标签: c++

我在C ++中使用外部C库(libsvm)。我使用

将头文件插入到我的类头文件中
extern "C"{
#include "svm.h"
}

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

svm_model *svm_train(input_parameters)

在我的代码中(在C ++中)我在我的类中创建了一个struct 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时,我都会得到一个segmentation_fault。这种情况发生在

m_data = svm_train(input_parameters);

但如果我这样做也会发生

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

事实上,我注意到即使我做了

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

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

感谢任何帮助。

3 个答案:

答案 0 :(得分:6)

如果它只是简单地崩溃

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

然后可能问题出在其他地方和之前。看起来当你调用printf函数this无效(也许是NULL?)或者你的内存堆状况非常糟糕时。

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

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

答案 1 :(得分:1)

文件svm.h已经有

extern "C" {

声明。所以而不是:

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

简单地做:

#include "svm.h"

此外,无需一次又一次地重复结构关键字。所以而不是:

struct svm_model *m_data;

做的:

svm_model *m_data;

答案 2 :(得分:0)

嗯,刚刚发现了这个问题,确实发生了其他问题。 发生的事情是我创建了一个myClass的STL向量,并且访问了这个向量的第一个元素的方法,即使我没有明确地创建它,即:。

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

鉴于所有内容都在正确编译,我不认为这部分代码会产生问题。

感谢大家的帮助。