1

メモリリークはありますか?

    const char * pname = "NAME";
    char * temp = new char[strlen(Name) + 64];
    sprintf(temp,"%s", pname);

    delete [] temp; // is there any memory leaks because now length of temp is 4.
4

3 に答える 3

6

文字列リテラル( )を削除(変更)するのは未定義の動作pnameです。またnew/deletenew []/delete[]はペアでのみ使用されます。

可能であれば使用を提案し、メモリの割り当て/割り当て解除を管理std::stringさせてください。std::string

  std::string pname("NAME");
  std::string temp(pname);
  std::cout << pname << std::endl;
于 2013-01-16T07:59:46.027 に答える
4

いいえ、 temp の末尾の 0 が割り当てられたメモリであっても、それはまだ初期でstrlen(Name) + 64あるため、削除によりメモリのブロック全体が解放されますが、これは正しいことです。

@billz が指摘したように、pname を解放しないでください。

于 2013-01-16T08:00:31.317 に答える
3

いいえ、メモリリークはありません。sprintf必要なバイトのみを使用しますがtemp、最初に作成されたすべてのバイトは割り当てられたままになります (未使用のバイトもあります)。

への呼び出しは、最初に割り当てられたすべてのバイトのdelete[] temp割り当てを解除します。

ただし、他の人が指摘しているように、解放しないでくださいpname。and でそれぞれ作成されたポインタに対してのみdeleteandを呼び出す必要があります。delete[]newnew[]

追加情報:

を作成したとき、メモリ内に連続するバイトの配列とtempnew[]割り当てに関する情報 (たとえば、割り当ての大きさなど) を格納する追加の (小さな) スペースを割り当てました。呼び出したときにdelete[]その情報を調べたところ、strlen(Name)+64バイトが割り当てられていることがわかったので、すべての割り当てを解除する必要があることを認識しています。割り当てられたスペースのごく一部しか使用していないという事実は、違いはありません。

于 2013-01-16T08:06:06.057 に答える