我在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,但不会更改任何内容。
感谢任何帮助。
答案 0 :(得分:6)
如果它只是简单地崩溃
printf ("hello: %p\n", (void*)m_data);
然后可能问题出在其他地方和之前。看起来当你调用printf
函数this
无效(也许是NULL
?)或者你的内存堆状况非常糟糕时。
在Linux上,我建议用g++ -Wall -g
编译一个最近的编译器(GCC 4.8刚刚发布)。改进代码直到没有给出警告。然后使用gdb
和valgrind进行更多调试。
您可能还希望使用调试信息和所有警告(或简单地使用该软件包的调试变体)编译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();
鉴于所有内容都在正确编译,我不认为这部分代码会产生问题。
感谢大家的帮助。