3

このようなCStringを使用している場合:

void myFunc(char *str)
{
  CString s(str);
  // Manipulate other data with CString
  // ...
  // Finished

  // Should I somehow delete 's' here to avoid a memory leak?
}

関数がスコープ外になると、文字列は消去されますか?

また、キーワードがメモリを割り当てることを知っていnewますが、キーワードなしでオブジェクトを作成した場合newでも、メモリは割り当てられますか?私の直感はそうだと言っていますが、確認したいと思います。

例えば

CString *asdf = new CString("ASDF");
// same as?
CString asdf("ASDF"); 
4

4 に答える 4

17

newヒープにメモリを割り当てるので、

CString *asdf = new CString("ASDF");

ヒープにaCStringを割り当て、それへのポインタをに割り当てますasdfasdfそのメモリは解放されず、を呼び出すまでのデストラクタは呼び出されませんdelete asdf

がないと、スタックnewに割り当てているので、

CString asdf("ASDF");

asdfを表すスタックメモリを割り当てます。このメモリは、スタックが巻き戻されると(関数から戻るときのように)自動的に再利用さasdfれ、スコープ外になるとのデストラクタが自動的に呼び出されます。

また、CString自身のリソースをクリーンアップするため、CStringオブジェクトがクリーンアップされると(スタック上にある場合はスコープ外になり、ヒープ上にある場合は削除されます)、使用するリソースもクリーンアップされます。

于 2012-06-07T18:20:50.310 に答える
1

CString文字列文字自体のメモリを管理するため、デストラクタでそのようなメモリを解放します(少し賢いですが、そのように考えてください)

CStringwithを割り当ててそれnewを呼び出さdeleteない場合、オブジェクトのメモリがリークするだけでなく、CStringそのデストラクタも呼び出されないため、文字列文字のメモリもリークします。

于 2012-06-07T18:15:00.667 に答える
1

ほとんどの場合、CStringオブジェクトを作成すると、2つの割り当てが発生します。1つはオブジェクト自体用で、もう1つは文字列の文字用です。文字の割り当てはオブジェクト内に隠されており、心配する必要はありません。最初の例のようにオブジェクトを自動変数として宣言すると、オブジェクトはブロックの最後、つまり閉じ中括弧で割り当てが解除されます。一緒に割り当てる場合は、new後で割り当てる必要がありますdelete。そうしないと、メモリリークが発生します。

于 2012-06-07T18:20:39.850 に答える
0

スタックにオブジェクトを割り当てた場合(つまり、newを使用しない場合)、関数の最後でスコープから外れると、オブジェクトは自動的に破棄されます。

于 2012-06-07T18:15:35.187 に答える