1

以下のプログラムでvalgrindを実行すると、メモリリークが報告されます。原因を説明していただけますか?

#include <string>
#include <iostream>

using namespace std;

int main()
{
    char * arr = (char *) ::operator new(sizeof(char));
    string s = arr;

    return 0;
}
  1. 行文字列s=arrで正確に何が起こりますか?arrのコピーを作成しますか?
4

5 に答える 5

5

valgrindは正しい。電話newをかけ、電話をかけないdeleteため、メモリリークが発生します。

に割り当てるarrs、後者は前者の所有権を取得しません。代わりに、コピーを作成します。解放するのはあなたの責任arrです。

于 2013-03-13T16:01:43.710 に答える
1

の所有権はにarr渡されず、の内部バッファsにコピーarrされます。オペレーターsでメモリを解放する必要がありますdelete

于 2013-03-13T16:02:54.047 に答える
1

delete arrコードの最後でメモリリークを処理します。

于 2013-03-13T16:01:41.180 に答える
1

私はあなたがstringの所有権を取得しarr、それが責任を負うとdelete仮定したと思いますarr。しかし、それは間違っています。

string s = arr;

arrに到達するまでから文字をコピーするだけ\0です。だから、あなたはあなた自身でなければなりませんdelete arr

于 2013-03-13T16:03:39.433 に答える
0

new[]C ++の演算子は、メモリを動的に割り当てます。このようなメモリはすべて、プログラマーが手動で解放する必要があります。これはdelete[]オペレーターが行います。newで割り当てたメモリを削除しないと、メモリリークが発生します。

このトピックの詳細については、このC++FAQを参照してください。

于 2013-03-13T16:08:01.363 に答える