0

私が現在取り組んでいるプログラムでは、 を含むオブジェクトがありますstd::vectors。これらのオブジェクトを削除しようとすると問題が発生し、オブジェクトからメモリが解放されません。

これをテストするために最小限のプログラムを作成しましたが、このプログラムでも正しく動作させることはできません。

これが私がテストに使用したプログラムです。

#include<iostream>
#include<vector>

struct node{

    std::vector<int> list;

    bool isParent;
    struct node* child;

    ~node(){
        delete[] child;
    }

    node(){
        isParent = false;
        list.push_back(5); // comenting this line would make it work correctly
    }

    void divide_r(){
        if (isParent){
            for(int i = 0; i < 8; i++){
                (child+i)->divide_r();
            }
        }else{
            node *c;
            c = new node[8];
            child = &c[0];
            isParent = true;
        }
    }
};

int main(){


    node *root = new node;

    for(int i = 0; i < 8; i++){
        root->divide_r();
    }

    delete root;

    sleep(10);

    return 0;
}

そのため、ベクトルに何かをプッシュすると、メモリを解放できません。

それが重要な場合、ubuntuでg ++を使用しています。私は何か間違ったことをしていますか、それともこれでうまくいくのでしょうか?

また、デストラクタの「リスト」からメモリを解放するためにさまざまな方法を使用しようとしましたが、「リスト」は範囲外になるため、とにかく解放する必要があると思います。

プログラムは約 1.4GB の RAM を使用しますが、スリープ後に何も解放されず、プログラムが終了します。

4

1 に答える 1

2

オブジェクトを割り当ててから削除してください。新しいオブジェクトを割り当てると、OS がメモリ使用量の増加を示さないことがわかります。

サンプルを valgrind で実行することもできますが、メモリ リークが発生していないことに気付くはずです。

その理由は明らかです。C ライブラリは、OS を呼び出してメモリの小さなチャンクを割り当てて返すという追加のオーバーヘッドを回避したいと考えています。

関連スレッド: Linux Allocator Does Not Release Small Chunks of Memory , Does call free or delete ever release memory back to "system"

于 2013-06-28T15:14:54.553 に答える