1

我正在使用 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,但没有改变任何东西。

任何帮助表示赞赏。

4

3 回答 3

6

如果它简单地崩溃

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

那么问题可能出在其他地方和之前。看起来当您调用该printf函数时this无效(也许NULL?)或者您的内存堆处于非常糟糕的状态。

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

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

于 2013-03-24T16:25:47.533 回答
1

文件 svm.h 已经有

extern "C" {

宣言。所以而不是:

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

只需这样做:

#include "svm.h"

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

struct svm_model *m_data;

做:

svm_model *m_data;
于 2013-03-24T16:34:59.090 回答
0

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

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

鉴于一切都在正确编译,我认为这部分代码不会出现问题。

感谢你的帮助。

于 2013-03-24T17:39:26.383 回答