在类中使用指向结构体的指针

using a pointer to a struct inside a class

本文关键字:结构体 指针      更新时间:2023-10-16

我正在使用c++内部的外部C库(libsvm)。我使用

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

这个库包含一个名为svm_model的结构体。它还包含一个函数,该函数给出一些输入参数,它为结构体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: %pn", m_data);

它也崩溃了。因此,我怀疑在类中使用指向结构(已在其他地方定义)的指针一定有问题,尽管我没有在任何地方发现任何提示。我尝试在我的类构造函数中初始化它为NULL,但没有改变任何东西。

如果崩溃,只需输入

  printf ("hello: %pn", (void*)m_data);

那么问题可能在其他地方和以前。它看起来像当你调用printf函数this是无效的(也许是NULL ?)或者你的内存堆是在非常糟糕的形状。

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

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

文件svm.h已经有

extern "C" {

声明。所以不是:

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

只是做:

#include "svm.h"

也没有必要一次又一次地重复struct关键字。所以不是:

struct svm_model *m_data;

:

svm_model *m_data;

嗯,刚刚发现问题,它确实在其他地方比报道。发生的事情是,我已经创建了myClass的STL向量,并且正在访问该向量的第一个元素上的方法,即使我没有显式地创建它,即:

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

考虑到一切都编译正常,我不认为这部分代码会出现问题。

谢谢大家的帮助。