我的智慧快要用完了。我已经搜索了几个小时来寻找解决方案,但没有找到可以解决我的问题的方法。
所以我想编写一个神经元网络代码,我已经为它编写了大量代码,并且到目前为止我已经检查和调试了这些代码。我尝试将我的网络发展多代,但尽管它确实执行了,但它给了我一个双重释放或损坏错误。我已将 valgrind 的错误追踪到此函数
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 在初始化和释放 element_already_mutated 的地方给我一个不匹配的 free()/delete/delete[] 错误。奇怪的是,如果我将动态分配注释掉并只初始化我的“解决方法”(它只是一个普通的静态数组),我就不会发生内存泄漏,并且所有内容都会被正确释放。 NUM_I 在 header 中定义为 4:
#define NUM_I 4
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)
有人可以告诉我我做错了什么吗?我不认为我的分配不正确,但我不知道错误可能出在哪里。
最佳答案
您有时会删除它,有时不会。这是强烈反对整个编码方法的主要原因。这是您的代码,删除了一些额外的内容,以便您可以更清楚地看到它:
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 已经在评论中提到了这一点。我错过了。
关于c++ - delete 不会在函数结束时释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47703769/