1

次のコードには明らかなメモリ リークがあります。

void Memory_Leak(void);
void Lots_Of_Other_Stuff(void);

int main(){

    Memory_Leak();
    Lots_Of_Other_Stuff();
}

void Memory_Leak(void)
{
  int *data = new int;
  *data = 15;
  return;
}
void Lots_Of_Other_Stuff(void){
    //allocates/deletes more memory
    //calls functions
    //etc..
    return;
}

プログラムの期間中、メモリを回復できますか?
プログラムは失われたメモリを上書きして、メモリが失われていない状態に到達できますか?
プログラムがまだ実行されている間に、オペレーティング システムはそれを回復できますか?

4

4 に答える 4

2

標準のC++には、メモリを使用していないことを知る方法がありません。

いくつかのプラットフォーム固有のメカニズムは、通常はデバッグのために、メモリヒープをイントロスペクトするために存在します。

http://msdn.microsoft.com/en-us/library/974tc9t1(v=vs.80).aspx

理論的には、このようなものを使用して、を実行する前にヒープ状態の「スナップショット」を取得することができMemory_Leak()ます。それが終わった後、あなたはあなたが漏れであると考えたものを探してそれを解放することができました。 しかし、それをしないでください。 徹底的に言及するだけです。

リークを回避するC++の方法は、「raw / naked / dumb/C-style」ポインターの代わりに「smart」ポインターを使用することです。例えば:

void Memory_Leak(void) // actually, with this change it won't leak anymore...
{
    shared_ptr<int> data (new int);
    *data = 15;
    return;
}

共有ポインタはデストラクタを備えたオブジェクトであるため、存続期間が終了したときにコードを実行する機会があります。そのコードはメモリを解放します。この場合、ローカル変数dataはreturnステートメントでその寿命を終了し、そのshared_ptrがコピーされて他の場所に格納されていない場合、整数のメモリに保持されている参照カウントはゼロになります。そのため、メモリが解放されます。

StackOverflow、Wikipedia、Googleなどでスマートポインターの詳細を読むことができます。

http://en.wikipedia.org/wiki/Smart_pointer

于 2012-11-27T03:45:25.327 に答える
2

いいえ、プログラムの実行が終了するまでメモリは回復されません。

いいえ。そのメモリを上書きできる場合、割り当てられたメモリへのポインタがまだ必要であるため、そもそもメモリリークはありませんでした(newまたはmallocで新しいメモリを割り当てても、すでに割り当てられている同じメモリは決して得られません)。

いいえ。OS は、プログラムがまだそのメモリを使用していないことを知る方法がないため、回復できません。

于 2012-11-27T03:33:21.070 に答える
1

はい、プログラムの実行中はメモリが失われます。このメモリ ロケーションへのすべての参照が失われたことをオペレーティング システムが認識する方法はありません。

これは、C/C++ と Java/C# の根本的な違いの 1 つです。

ガベージ コレクションは、メモリの場所にそれを参照するものがなくなったかどうかを判断するために使用されるメカニズムであり、OS が未使用のメモリを再利用できるようにするものであり、C/C++ では使用できません。

于 2012-11-27T03:35:26.063 に答える
1

プログラムの期間中、メモリはすべて回復されますか?

いいえ: 失われた変数のアドレスを魔法のように推測して を呼び出さない限り、失われdeleteています。

プログラムは今、このメモリを上書きして、メモリが失われていない状態に到達できますか?

いいえ、割り当てられたメモリ領域のアドレスへの参照が失われると、対応するメモリ チャンクを回復できなくなります。

プログラムがまだ実行されている間に、オペレーティング システムはそれを回復できますか?

いいえ、プロセスが終了するまで、オペレーティング システムはそのメモリを回復しません。

于 2012-11-27T03:36:33.240 に答える