0

こんにちは、次のコードがあります。slaveQueue からノードを取得し、preload1 と preload2 にプリロードしますが、メモリは常に増加しています。ローカル関数が戻った後にすべてのメモリを解放する必要があり、 pop() 関数もメモリを解放することを確認したため、 dfs を呼び出した後に解放する必要があると思いますか? 私のメモリリークはどこにあるのだろうか?ありがとう

    queue<Graphnode> *preload1 = new queue<Graphnode>;
    queue<Graphnode> *preload2 = new queue<Graphnode>;
    for(int n = windowWidth; n > 0; n--)
    {
        if((*slaveQueue).empty())
        {
            //cout <<"fffffffffffff"<<endl;
            break;
        }
        (*preload2).push((*slaveQueue).front());
        //cout << (*slaveQueue).size()<<endl;
        (*slaveQueue).pop();
    }
    int preload1No =0;

    while(!(*preload2).empty())
    {
        preload1No++;
        *slaveroot = (*preload2).front();
        (*preload2).pop();
        if(!(*slaveQueue).empty())
        {
            (*preload2).push((*slaveQueue).front());
            (*slaveQueue).pop();
        }
        dfs(*slaveroot,goal,totalDepth,*preload1,*preload2,checkfile);
        if(preload1No>windowWidth)
        {
            (*preload1).push(*slaveroot);
            (*preload1).pop();
        }
        else
        {
            (*preload1).push(*slaveroot);
        }
        cout<<(*preload1).size()<<"\t"<<(*preload2).size()<<endl;
    }
    delete slaveroot;
    delete preload1;
    delete preload2;
    delete slaveQueue;
4

6 に答える 6

2

はい、ポインタのコピーを作成しますが、指すaメモリのコピーは作成しませんa。したがって、ここではメモリ リークは発生しないため、解放するものはありません。

于 2013-02-15T17:49:53.910 に答える
1

でメモリを明示的に割り当てておらずfunc1、それを行う関数を呼び出さない場合、メモリ リークは発生しません。関数にコピーしているのはポインタだけです。コピーされたポインター自体は関数のスタック上にあり、関数が戻ると、関数のスコープ内の他のすべてのものと共にポップされます。

于 2013-02-15T17:50:38.013 に答える
1

ainはfunc1値渡しであり、スタック上にあることを意味します。したがって、メモリリークは発生しません。出ると解除されfuncます。

于 2013-02-15T17:49:20.570 に答える
0

スタック上にのコピーを作成しaます。しかし、そのメモリは関数が戻るとすぐに回復されます。

メモリ リークがある場合は、ここに示されていないコードが原因である可能性があります。

于 2013-02-15T17:49:44.543 に答える
0

示されているコードには、メモリ リークはありません。

于 2013-02-15T17:49:24.920 に答える
0

関数に渡すと、それ自体aのコピーが渡されます。a関数が終了すると、そのコピーaは破棄されます。を指すメモリaは、コードにまったくコピーされません。

無限ループで呼び出しているため、コードはメモリ1の 1 バイトをリークするため、は実行されません。ただし、ほとんどの人がメモリ リークについて話したり考えたりするとき、「進行性」リーク、つまりプログラムの実行時間が長くなるほどメモリ リークが増えるものを考えています。func1delete a;


  1. 技術的なことを言うと、リークするのはメモリ マネージャーからの最小サイズのブロック 1 つです。通常、これは 1 バイトより大きくなりますが、正確にどれだけ大きくなるかは実装によって異なります。
于 2013-02-15T17:55:18.687 に答える