首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >delete不会在函数结束时释放内存

delete不会在函数结束时释放内存
EN

Stack Overflow用户
提问于 2017-12-07 21:05:49
回答 2查看 679关注 0票数 0

我的智慧就快结束了。我已经找了好几个小时来解决这个问题,但是我还没有找到解决问题的方法。

所以我想编写一个神经元网络,我已经为它编写了大量的代码,到目前为止我已经对它进行了检查和调试。我试着在几代人的时间内改进我的网络,但是虽然它确实执行了,但它给了我一个双重的免费或损坏错误。我从这个函数中找到了这个错误,并对其进行了分析。

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
#define NUM_I 4

瓦莱尔错误:

代码语言:javascript
复制
==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)

有人能告诉我我做错了什么吗?我不认为我是错误的,但我不知道错误可能在哪里。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-07 21:38:54

你有时删除它,有时不删除它。这就是为什么这整个编码方法被强烈禁止的主要原因。下面是删除了一些额外内容的代码,这样您就可以更清楚地看到它:

代码语言:javascript
复制
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已经在注释中提到了这一点。我错过了。

票数 1
EN

Stack Overflow用户

发布于 2017-12-07 21:32:28

考虑到您展示的函数,避免内存泄漏(如果这个函数确实是唯一一个泄漏内存的函数)的最简单方法是使用std::向量

代码语言:javascript
复制
#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的初始化是在构造向量时自动完成的,因此不再需要将布尔数组初始化为falsefor循环。

2)必须删除对delete [] element_already_mutated;的调用,因为element_already_mutated不再是指针。此外,vector将自动释放它已分配的内存,这也是删除delete []的另一个原因。

3)您所拥有的return true;语句将不再引起问题,因为如果mutate_a_neuron函数由于任何原因返回,则vector<bool>将被销毁,从而消除内存泄漏的任何可能性。

4)由于使用vector的代码使用[]进行访问,因此不需要更改其余代码,因为std::vector重载operator []以充当数组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47703769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档