大量对象导致分段错误

Posted

技术标签:

【中文标题】大量对象导致分段错误【英文标题】:Large array of object causes Segmentation Fault 【发布时间】:2013-08-04 12:56:29 【问题描述】:

我正在尝试使用 G++ 在 Ubuntu 12.10 下运行此代码。

NodeFeature *feature_all;    
NODE_NO = 20449;    
feature_all = new NodeFeature[NODE_NO];

我收到消息Segmentation FaultNodeFeature 是一个结构体:

struct NodeFeature
    
        int len; //length of vector
        double *val; //vector of observational features
        int *index; //vetor of indexes of features
        int *label_start; //array indexes of the starting point for each label
        int *label; //the labels being activated at this node
    ;

有什么问题?我该如何解决?

编辑: 如果您需要查看整个代码和测试数据,都可以在这里找到:http://vietlabs.com/crf-sl/

【问题讨论】:

段错误发生在哪里?很难从您发布的代码中猜出任何内容(除了“错误地使用结构的指针之一)。 看来段错误不是由您在此处发布的代码引起的。需要更多信息。 我已经逐行调试了代码,在这行代码发生了。您还需要什么其他信息? @MOLi 你的意思是段错误发生在feature_all = new NodeFeature[NODE_NO]; 上吗? feature_all 是如何声明的? NodeFeature *feature_all; 【参考方案1】:

feature_all 声明为什么类型? 应该是:

NodeFeature *feature_all;

【讨论】:

【参考方案2】:

您正在尝试动态分配 4 GB 的数据。 我预计它会崩溃,有关更多信息,请参阅此链接。The limited allocation size C++

发生这种情况是因为成员 SeqFeature::OB_F_MAX 未初始化(结果为负值),并且该值被分配给 SeqClassifier::OB_F_SIZE,用于在函数 SeqClassifier::initParam 中进行计算转换为一个巨大的正值,并作为动态创建 double 数组的大小给出。

简单来说,OB_F_MAX 的未初始化值导致数组的size 具有巨大的正值。 这个巨大的正值被传递给new 运算符,导致大小约为4 GB。

另外,请注意,在 32 位 x86 系统上,您不能请求 4 GB 甚至 3 GB 的内存,正如上面提到的链接所指出的那样。

【讨论】:

你是说代码占用了很多空间,运行起来无能为力?你能在你的机器上运行它吗? 应该有办法,但我不知道如何实现。是的,我在 VS2010 中运行过它,我在上述函数中遇到了崩溃。 初始化该变量,如果我的程序请求的内存大小在范围内,它应该可以工作。 感谢您的回答。我在 Ubuntu 下运行它。我尝试了另一段代码,但仍然有同样的问题。我没有更新该数组 kf 结构,而是写了这个: int* temp = new int[2*NODE_NO];它仍然显示“分段错误”。我想这是元素数量的问题。那么其他人是如何处理大量数据的呢? 也许可以尝试在谷歌上搜索,或者在这里问另一个问题。我不知道如何解决这个问题。

以上是关于大量对象导致分段错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个非常简单的构造函数会导致段错误?

为啥我的字符串分配会导致分段错误?

为啥释放内存会导致分段错误?

确定导致分段错误的代码行?

带有 ifort 的 tracebackqq() 导致分段错误

为啥重新声明 std::cout 会导致分段错误?