2

ワイルドポインタについて説明している記事を読んでいたところです。ガベージメモリの場合、メモリオブジェクトを指すポインタが失われると、つまり、メモリアイテムは引き続き存在するが、それへのポインタは失われることを示します。これは、メモリが明示的に解放されていない場合に発生します。私は例を挙げてこれを理解しようとしていました。これが私が書いたものです

#include <iostream>

using namespace std;
int q =12;
int point()
{
   int *p;
   p = &q;
   //delete p;
}
int main()
{
   point();
   return 0;
}

したがって、上記の例では、メモリ項目(q)は引き続き存在しますが、それへのポインタは失われます。私はそれをすべて間違って誤解したかもしれませんが、それを正しく理解した場合、この例は上記の「ガベージメモリ」の定義に対応していますか?はいの場合、delete pを使用する必要がありますよね?

4

1 に答える 1

10

C ++には、あなたが理解しているようなガベージコレクションがありません。しかし、あなたが示しているのは、私が言っている「メモリリーク」ではありません。

この場合、動的に割り当てられておらず、プログラムの期間中、関数の外部からアクセスできるメモリ位置を指していることになります。


int point()
{
   int *p = new int();
   //delete p;
}

メモリはまだ割り当てられているため、これはメモリリークになりますが、誰もそれにアクセスできなくなります。これがJavaまたはGCをサポートする他の言語である場合、このメモリはガベージコレクションのためにキューに入れられます


C ++で推奨されるスタイルは、以下のようなスマートポインターを使用して、リソース取得は初期化(RAII)と呼ばれる概念を使用して、割り当てられたすべてのメモリを可能な限り自動割り当て解除することです。

int point()
{
   std::unique_ptr<int> p(new int());
   //delete p;  // not needed.
}

delete変数pが破棄されると、そのスコープの最後で、割り当てられたメモリが自動的に呼び出されるため、その必要はありません。後からクリーンアップすることで、以下を可能にします。

C ++は、ごみの生成が非常に少ないため、私のお気に入りのガベージコレクション言語です。

Bjarne StroustrupのFAQ:本当にそう言ったのですか?2007年11月15日に取得。 http://en.wikiquote.org/wiki/Bjarne_Stroustrup

于 2013-01-14T02:11:28.267 に答える