メモリリークはありますか?
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.
メモリリークはありますか?
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.
文字列リテラル( )を削除(変更)するのは未定義の動作pname
です。またnew/delete
、new []/delete[]
はペアでのみ使用されます。
可能であれば使用を提案し、メモリの割り当て/割り当て解除を管理std::string
させてください。std::string
std::string pname("NAME");
std::string temp(pname);
std::cout << pname << std::endl;
いいえ、 temp の末尾の 0 が割り当てられたメモリであっても、それはまだ初期でstrlen(Name) + 64
あるため、削除によりメモリのブロック全体が解放されますが、これは正しいことです。
@billz が指摘したように、pname を解放しないでください。
いいえ、メモリリークはありません。sprintf
必要なバイトのみを使用しますがtemp
、最初に作成されたすべてのバイトは割り当てられたままになります (未使用のバイトもあります)。
への呼び出しは、最初に割り当てられたすべてのバイトのdelete[] temp
割り当てを解除します。
ただし、他の人が指摘しているように、解放しないでくださいpname
。and でそれぞれ作成されたポインタに対してのみdelete
andを呼び出す必要があります。delete[]
new
new[]
追加情報:
を作成したとき、メモリ内に連続するバイトの配列とtemp
、new[]
割り当てに関する情報 (たとえば、割り当ての大きさなど) を格納する追加の (小さな) スペースを割り当てました。呼び出したときにdelete[]
その情報を調べたところ、strlen(Name)+64
バイトが割り当てられていることがわかったので、すべての割り当てを解除する必要があることを認識しています。割り当てられたスペースのごく一部しか使用していないという事実は、違いはありません。