Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除不';t在函数末尾释放内存_C++_Memory_Memory Management_Free - Fatal编程技术网

C++ 删除不';t在函数末尾释放内存

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

这件事让我快疯了。我已经找了几个小时来解决这个问题,但我还没有找到解决我问题的方法

所以我想编码一个神经网络,我已经为它写了大量的代码,到目前为止我已经检查和调试过了。我试着在几代人的时间里发展我的网络,但尽管它确实执行了,但它给了我一个双重的自由或腐败错误。我已经用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错误:

==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;
}