从makefile运行应用程序时出现分段错误

时间:2015-04-17 06:34:50

标签: c++ memory makefile segmentation-fault armadillo

我有一个程序,我只能从Makefile运行它,否则它会给我这个错误:

  

分段错误(核心转储)

但如果我从Makefile运行应用程序,那就没关系了。我简化了我的代码:

这是我的make文件:

all: 
    g++ aaa.cpp
run:
    ./a.out

这是我的代码:

#include <iostream>
#include <armadillo>

class CModel
{
public:
    arma::mat::fixed<5,10000000> buffer;
};


int main()
{
    CModel m1, m2;
    std::cout<<"run successfully"<<std::endl;
    return 0;
}

当它出现在makefile之外时,这似乎是内存占用的一个问题,但是当它在makefile中时它是如何工作的?

$ make
g++ aaa.cpp
$ make run
./a.out
run successfully
$ ./a.out
Segmentation fault (core dumped)

其他信息:

OS:Linux(Ubuntu)

使用armadillo矩阵库:

sudo apt-get install libarmadillo-dev

2 个答案:

答案 0 :(得分:1)

我没有犰狳,所以我无法测试你的代码。但是通过查看它,我猜你有堆栈溢出。这是分段错误的特定时间。

根据程序的运行方式(以及星星的位置等),分段故障的出现并不罕见。

尝试减小堆栈的大小。尝试:

arma::mat::fixed<5,1000> buffer;

而不是:

arma::mat::fixed<5,10000000> buffer;

或者如果确实必须将其放在堆而不是堆栈上(使用new / delete)。高内存使用情况实例不应该在堆栈上并且始终在堆上。

答案 1 :(得分:0)

使用堆而不是堆栈:

int main()
{
    CModel *m1 = new CModel;
    CModel *m2 = new CModel;
    std::cout<<"run successfully"<<std::endl;
    delete m1;
    delete m2;
    return 0;
}

当然,您需要使用m1-&gt; SomeMember而不是m1.SomeMember