2

使用後に構造メモリを解放する必要がありますか? サンプルコードがあります:

struct aa 
{
int a;
char * b ;
    aa()
    {
    a=0;
    b= new char[255];
    }
} ;


aa *ss = new aa[3];

void fill()
{
    aa * ssss = new aa;
    aa * sss = new aa;

    sss->a=10;
    ss[0] = *sss;
    cout<<ss[0].a<<"\n";
    ss[1] = *sss;

    cout<<ss[1].a<<"\n";
    cout<<ssss[1].a<<"\n";
}

int _tmain(int argc, _TCHAR* argv[])
{


    fill();
    delete(ss);
}

delete(ssss)の最後にやらなければならないことはありfillますか?

ssの最後にある構造体の配列を削除する必要がありmainますか?

*b メモリを解放する destruct または to structure ss を作成する必要がありますか?

クラスはどうですか?同じロジックですか?

4

4 に答える 4

8

塗りつぶしの最後に削除 (ssss) を行う必要がありますか?

はい、 で作成されたものはすべて削除する必要がありますnew。ただし、newここで使用する必要はありません。自動にするだけです。

void fill() {
    aa ssss; // automatically destroyed on exit from the function
}

main の末尾にある構造体の ss 配列を削除する必要がありますか?

はい。ただし配列なので、配列として削除する必要があります。

delete [] ss;
       ^^

ただし、これを動的に割り当てる理由はありません。

aa ss[3]; // automatically destroyed on exit from the program

*b メモリを解放する destruct または to structure ss を作成する必要がありますか?

生のポインターを使用して動的配列を管理したい場合は、はい。また、クラスを安全に使用できるようにするために、 ( Rule of Threeに従って) コピー コンストラクターとコピー代入演算子について考える必要があります。または、スマート ポインターまたはコンテナーを使用してメモリを管理します。

struct aa 
{
    int a;
    std::vector<char> b ;

    aa() : a(0), b(255) {}
} ;

クラスはどうですか?同じロジックですか?

はい、ルールは常に同じです。 で作成されたものはすべて で破棄するnew必要がありますdelete。可能な限り動的割り当てを避け、本当に必要なときにスマート ポインター、コンテナー、およびその他のRAIIクラスを使用すると、オブジェクトの管理がはるかに簡単になります。

于 2012-07-21T14:54:59.017 に答える
5

を使用する場合は、メモリ リークを避けるために をnew使用する必要があります。deleteスタックで変数を宣言すると、スコープを出ると自動的に解放されます。

void something();
{
    aa b = new aa();
    // Do something
    delete b; // You must use delete
}

void something();
{
    aa b();
    // Do something
    // You don't have to use delete
}

特定のケースでは、deleteプログラムはとにかく終了し、割り当てられたすべてのメモリが OS によって解放されるため、厳密に使用する必要はありません。

一貫性を保つために、そうするのは良い習慣です (ただし、多くの複雑なオブジェクトを解放するには時間がかかり、プログラムの終了が遅くなる可能性があるため、これを行いたくない特定のケースがあります)。

とにかく、C++ ではネイキッド ポインターを使用することはあまり良い考えではありません。これは、デストラクタを呼び出してスコープを使い果たした後にメモリを解放する、いわゆるスマート ポインター ( や など) が多数あるためshared_ptrです。unique_ptr

PS:aa構造体がコンストラクター内で使用され、デストラクタでnew呼び出されないため、コードではメモリ リークが発生します。delete

于 2012-07-21T14:47:11.717 に答える
0

はい

どうぞ、どうぞ、あなたの記憶を解放してください。ここでは詳しく説明しませんが、この回答を見てください。 演算子new / mallocを使用して割り当てられたメモリブロックは、プログラム実行の終了後も存続できますか?

于 2012-07-21T15:31:46.610 に答える
0

経験則C/C++

  • ?で割り当てられnewます でメモリを解放しますdelete
  • malloc、、?callocで割り当てられます reallocでメモリを解放しますfree(void*)
于 2012-07-21T17:08:09.343 に答える