内存泄漏使用类方法

时间:2016-01-21 18:20:04

标签: c++ memory-leaks

我的程序有问题:我有内存泄漏。我知道,因为当我查看内存使用时,它永远不会停止增加,然后程序崩溃。

我已经注意到它发生的原因是这一行(当我发表评论时没有问题):

replica[n].SetTempId(i+1); // FUITE MEMOIRE SUR CETTE LIGNE !!

我已经检查过n从不大于我的数组的大小(这是一个矢量类型,见下文)。

我的课程:

class Replica
{
    /* All the functions in this class are in the 'public:' section */
    public:
        Replica();
        ~Replica();
        void SetEnergy(double E);
        void SetConfName(string config_name);
        void SetTempId(int id_temp);
        int GetTempId();
        string GetConfName();
        double GetEnergy();
        void SetUp();
        void SetDown();
        void SetZero();
        int GetUpDown();   

    /* All the attributes in this class are in the 'private:' section */
    private:
        double m_E; // The energy of the replica
        string m_config_name; // The name of the config file associated
        int m_id_temp; // The id of the temperature where the spin configuration is.
        int m_updown;
};

方法

void Replica::SetTempId(int id_temp)
{
    m_id_temp=id_temp;
}

我像这样初始化了我的对象:

vector<Replica> replica(n_temp); // we create a table that will contain information on the replicas.

构造函数:

Replica::Replica() : m_E(0), m_config_name(""), m_updown(0), m_id_temp(0)
{

}

我如何初始化我的载体:

for(int i=0; i<=n_temp-1 ; i++) // We write the object replica that will contain information on a given spin configuration.
                {
                    string temp_folder="";
                    temp_folder= spin_folder +  "/T=" + to_string(Tf[i]) + ".dat";
                    replica[i].SetEnergy(Ef[i]+i); // we save the energy of the config (to avoid to calculate it)
                    replica[i].SetConfName(temp_folder); // we save the name of the file where the config is saved (to avoid to have huge variables that will slow down the program)
                    replica[i].SetTempId(i);
                    replica[i].SetZero();
                    if(i==0)
                        replica[i].SetDown();
                    if(i==(n_temp-1))
                        replica[i].SetUp();
                }

我是C ++的初学者,所以这可能是一个基本错误。

感谢您的帮助!

我已经阅读了你的答案。

但是编写一个最小的代码很难:我试图删除一些东西,但是一旦删除它就行了。

实际上问题非常“随机”,例如当我删除我的行时:

replica[n].SetTempId(i+1);

它可以工作,但我可以删除这一行,但当我删除我的代码的另一行时,它也可以工作(我不知道你是否明白我的意思)。 由于这种“随机性”,很难找到这个bug ......

我也可以说当它崩溃时程序会说:

terminate called after throwing an instance of 'std::bad_alloc'


 what():  std::bad_alloc

那么,你能不能猜一下可能导致这个错误的原因(因为我没有写到最小的代码)。

我不对我的代码进行动态分配。

我的代码结构如下:

while(Nsw_c<Nsw)
        {
cout << "test1";
         // a 
// lot
// of
// code
// with some Nsw_c++
    // and this cout at the end of the loop
         cout << " Nsw_c : " << Nsw_c << endl << " i " << i << " compteur_bug " << compteur_bug;
        }


cout << "test2";

它总是冻结在这个循环结束的cout上。

我知道这一点,因为冻结时它们都没有显示test2或test1,而且它是下一个cout。

Nsw,Nsw_c,i是低于100的整数(它们不是太大)。

更确切地说,如果我在循环结束时用另外一个cout替换cout:

cout << " test ";

它也会在同一个地方冻结。

事实上,程序总是在我结束时冻结(在分析条件之前就开始了)。

但是Nsw和Nsw_c并不大,所以这就是奇怪的原因。

我试图更换条件Nsw_c&lt; Nsw只是“1”而且它不再冻结了。所以它可能是一个问题,但两者都只是“正常”整数所以...

谢谢!

我已经启动了gdb(我刚学会使用它),我写道:

抓住std :: bad_alloc

调试器然后执行此操作(我不知道它是否可以提供帮助):

没有停在C ++异常catchpoint上 Catchpoint 1(抛出异常),__ cxa_throw()中的0xb7f25290来自/ usr / lib / i386-linux-gnu / libstdc ++。so.6

0 个答案:

没有答案