我的程序有问题:我有内存泄漏。我知道,因为当我查看内存使用时,它永远不会停止增加,然后程序崩溃。
我已经注意到它发生的原因是这一行(当我发表评论时没有问题):
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