C++ 删除不';t在函数末尾释放内存
这件事让我快疯了。我已经找了几个小时来解决这个问题,但我还没有找到解决我问题的方法 所以我想编码一个神经网络,我已经为它写了大量的代码,到目前为止我已经检查和调试过了。我试着在几代人的时间里发展我的网络,但尽管它确实执行了,但它给了我一个双重的自由或腐败错误。我已经用valgrind追踪到这个函数的错误C++ 删除不';t在函数末尾释放内存,c++,memory,memory-management,free,C++,Memory,Memory Management,Free,这件事让我快疯了。我已经找了几个小时来解决这个问题,但我还没有找到解决我问题的方法 所以我想编码一个神经网络,我已经为它写了大量的代码,到目前为止我已经检查和调试过了。我试着在几代人的时间里发展我的网络,但尽管它确实执行了,但它给了我一个双重的自由或腐败错误。我已经用valgrind追踪到这个函数的错误 bool mutate_a_neuron(Neuron* neuron, int numberofneurons, int numberofinputs){ int num_e = 3
bool mutate_a_neuron(Neuron* neuron, int numberofneurons, int numberofinputs){
int num_e = 3*NUM_I+3;
bool* element_already_mutated = new bool[num_e]; //line 91
//bool element_already_mutated[15]; //Workaround :(
for(int i =0; i<num_e; i++){
element_already_mutated[i]=false;
}
int number_of_elements = (int) neuron->numberofelementstomutate;
unsigned short will_it_be_mutated = rand() % USHRT_MAX ;
if( neuron->mutationrate > will_it_be_mutated ){
for(int i = 0; i<number_of_elements; i++){
int elementtomutate = rand() % num_e; //choose random element
if(element_already_mutated[elementtomutate]){//check if mutated
i--;
continue;
}
if( mutate_element(neuron, elementtomutate, numberofneurons, numberofinputs) ){//mutate stuff
element_already_mutated[elementtomutate]=true;
} else {
printf("Something went wrong while mutating an element or takes_input was false\n"); //die if error
}
}
return true;
}
delete [] element_already_mutated; //line 120
return false;
}
Valgrind错误:
==1887== 15,023,190 bytes in 1,001,546 blocks are definitely lost in loss record 1 of 1
==1887== at 0x4C2C93F: operator new[](unsigned long) (vg_replace_malloc.c:423)
==1887== by 0x10A461: mutate_a_neuron(Neuron*, int, int) (n.cpp:91)
==1887== (here follow more functions, which call mutate_a_neuron)
有人能告诉我我做错了什么吗?我认为我没有错误地解除分配,但我不知道错误可能在哪里。鉴于您展示的函数,避免内存泄漏的最简单方法(如果此函数确实是唯一泄漏内存的函数)是使用
#包括
布尔变异神经元(神经元*神经元,int numberofneurons,int numberofinputs){
int num_e=3*num_I+3;
std::向量元素已经变异(nume);
int number of_元素=(int)neuron->numberofelement突变;
未签名的短消息将\u it \u被\u mutated=rand()%USHRT\u MAX;
//...
//代码的其余部分
//
//delete[]元素\u已经\u变异不再需要
返回false;
}
1) 向量构造时,vector
元素初始化为false
,因此不再需要将布尔数组初始化为false
的for
循环
2) 对delete[]元素的调用已经发生了变化代码>必须删除,因为已变异的元素不再是指针。此外,vector
将自动释放已分配的内存,这也是删除delete[]
的另一个原因
3) 返回true代码>语句将不再引起问题,因为如果mutate\u a\u neuron
函数出于任何原因返回,那么向量将被销毁,从而消除内存泄漏的任何可能性
4) 由于使用vector
的代码使用[]
进行访问,因此不需要更改代码的其余部分,因为std::vector
重载运算符[]
,以充当数组。鉴于您显示的函数,避免内存泄漏的最简单方法是(如果此函数确实是唯一一个泄漏内存的函数)将使用
#包括
布尔变异神经元(神经元*神经元,int numberofneurons,int numberofinputs){
int num_e=3*num_I+3;
std::向量元素已经变异(nume);
int number of_元素=(int)neuron->numberofelement突变;
未签名的短消息将\u it \u被\u mutated=rand()%USHRT\u MAX;
//...
//代码的其余部分
//
//delete[]元素\u已经\u变异不再需要
返回false;
}
1) 向量构造时,vector
元素初始化为false
,因此不再需要将布尔数组初始化为false
的for
循环
2) 对delete[]元素的调用已经发生了变化代码>必须删除,因为已变异的元素不再是指针。此外,vector
将自动释放已分配的内存,这也是删除delete[]
的另一个原因
3) 返回true代码>语句将不再引起问题,因为如果mutate\u a\u neuron
函数出于任何原因返回,那么向量将被销毁,从而消除内存泄漏的任何可能性
4) 由于使用vector
的代码使用[]
进行访问,因此不需要更改其余代码,因为std::vector
重载操作符[]
以充当数组。您有时删除它,有时不删除它。这是强烈反对这种编码方法的主要原因。这是您的代码,删除了一些额外的内容,以便您可以更清楚地看到它:
bool mutate_a_neuron(...){
bool* element_already_mutated = new bool[num_e];
if( condition ){
// not deleted
return true;
}
delete [] element_already_mutated;
return false;
}
编辑:实际上,邪恶羊已经在评论中提到了这一点。我错过了。你有时删除它,有时不删除。这是强烈反对这种编码方法的主要原因。这是您的代码,删除了一些额外的内容,以便您可以更清楚地看到它:
bool mutate_a_neuron(...){
bool* element_already_mutated = new bool[num_e];
if( condition ){
// not deleted
return true;
}
delete [] element_already_mutated;
return false;
}
编辑:实际上,邪恶羊已经在评论中提到了这一点。我错过了。你在(潜在)返回后调用delete[]
-如果块被命中,它将不会被执行只要不要手动执行动态内存,而是使用std::vector
bool*元素已经变异=新bool[num\e]代码>-将其更改为std::vector element\u已发生变异(num\u e)
,然后删除初始化向量的for
循环和delete[]
语句。即使是过早的返回真值
现在也将是无害的,因为向量
将自动销毁自身。如果错误
是假的,您的注释
//就会消失。我已经搜索了数小时来寻找解决方法,但我还没有找到解决问题的方法。-如果是这种情况,很多都与你可能链接到的坏C++代码有关,或者与你所教的那些不太好的课程/教程有关。解决方法是使用std::vector
,除非你有可行的理由使用它,否则永远不要考虑new[]/delete[]
。在(潜在的)返回后调用delete[]
-如果块被命中,它将不会被执行,只是不要手动执行动态内存操作,但是使用std::vector
bool*元素已经变异=新bool[num_e]代码>-将其更改为std::vector element\u已发生变异(num\u e)
,然后删除初始化向量的for
循环和delete[]
语句。
bool mutate_a_neuron(...){
bool* element_already_mutated = new bool[num_e];
if( condition ){
// not deleted
return true;
}
delete [] element_already_mutated;
return false;
}