我的智慧就快结束了。我已经找了好几个小时来解决这个问题,但是我还没有找到解决问题的方法。
所以我想编写一个神经元网络,我已经为它编写了大量的代码,到目前为止我已经对它进行了检查和调试。我试着在几代人的时间内改进我的网络,但是虽然它确实执行了,但它给了我一个双重的免费或损坏错误。我从这个函数中找到了这个错误,并对其进行了分析。
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;
}在element_already_mutated被初始化和释放的地方,瓦伦给了我一个不匹配的空闲()/delete/element_already_mutated错误。奇怪的是,如果我把动态分配注释掉,并且只是初始化我的“解决方案”(这只是一个普通的静态数组),我就没有内存泄漏,所有的东西都被正确地分配了。NUM_I在标题中定义为4,如下所示:
#define NUM_I 4瓦莱尔错误:
==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)有人能告诉我我做错了什么吗?我不认为我是错误的,但我不知道错误可能在哪里。
发布于 2017-12-07 21:38:54
你有时删除它,有时不删除它。这就是为什么这整个编码方法被强烈禁止的主要原因。下面是删除了一些额外内容的代码,这样您就可以更清楚地看到它:
bool mutate_a_neuron(...){
bool* element_already_mutated = new bool[num_e];
if( condition ){
// not deleted
return true;
}
delete [] element_already_mutated;
return false;
}编辑:实际上,UnholySheep已经在注释中提到了这一点。我错过了。
发布于 2017-12-07 21:32:28
考虑到您展示的函数,避免内存泄漏(如果这个函数确实是唯一一个泄漏内存的函数)的最简单方法是使用std::向量。
#include <vector>
bool mutate_a_neuron(Neuron* neuron, int numberofneurons, int numberofinputs){
int num_e = 3*NUM_I+3;
std::vector<bool> element_already_mutated(num_e);
int number_of_elements = (int) neuron->numberofelementstomutate;
unsigned short will_it_be_mutated = rand() % USHRT_MAX ;
//...
// rest of your code
//
// delete [] element_already_mutated is no longer needed
return false;
}1) vector元素到false的初始化是在构造向量时自动完成的,因此不再需要将布尔数组初始化为false的for循环。
2)必须删除对delete [] element_already_mutated;的调用,因为element_already_mutated不再是指针。此外,vector将自动释放它已分配的内存,这也是删除delete []的另一个原因。
3)您所拥有的return true;语句将不再引起问题,因为如果mutate_a_neuron函数由于任何原因返回,则vector<bool>将被销毁,从而消除内存泄漏的任何可能性。
4)由于使用vector的代码使用[]进行访问,因此不需要更改其余代码,因为std::vector重载operator []以充当数组。
https://stackoverflow.com/questions/47703769
复制相似问题