c++ - delete 不会在函数结束时释放内存

标签 c++ memory memory-management free

我的智慧快要用完了。我已经搜索了几个小时来寻找解决方案,但没有找到可以解决我的问题的方法。

所以我想编写一个神经元网络代码,我已经为它编写了大量代码,并且到目前为止我已经检查和调试了这些代码。我尝试将我的网络发展多代,但尽管它确实执行了,但它给了我一个双重释放或损坏错误。我已将 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/

相关文章:

c++ - 从 VS2008 迁移到 VS2010 时要记住的事情

c++ - 如何将thread::id 发送给PostThreadMessage?

将捕获作为函数指针的 C++ lambda

java - 退出 java (Grails) 应用程序后, "used"内存未释放

performance - MongoDB 将文档预加载到 RAM 中以获得更好的性能

c - realloc 不为下一个结构分配内存

ios - 使用 AFNetworking 获取图像时内存增长

c++ - 为什么收到此警告: ISO c++ forbids variable lenght array 'v' [-Wvla] [duplicate]

iOS - 即使实际应用程序(SpriteKit 应用程序)没有显示内存泄漏,内存使用量也会不断增长

iphone - iOS 5 最佳实践(发布/保留?)