0

次のコードがあります。

void someFunction() {
  .......
  myClass obj= *(new myClass()); 

  ........

  delete &obj;
}

無効なポインターを示す実行時エラーが発生します。

コードは「削除」行なしで正常に実行されます。

new 演算子によって動的に割り当てられたメモリを再利用する必要があることはわかっています。しかし、この場合何が起こっているのか、メモリを解放する必要があるのか​​ 、さらにはどうすればよいのかわかりません。

ありがとう

4

5 に答える 5

4

インスタンスがこの関数のスコープ内にのみ存在することを意図している場合は、動的割り当てを使用する必要はありません...

void someFunction() {
  .......
  myClass obj; 

  ........

}

... この場合、objコンストラクターは at で宣言されたときにmyClass obj呼び出され、デストラクタは関数が返されたときに呼び出されます。それ以外の場合、動的でなければならない場合、これは...

void someFunction() {
  .......
  myClass* obj = new myClass(); 

  ........

  delete obj;
}

...この場合、呼び出し時にコンストラクタが呼び出され、呼び出しnew myClass()時にデストラクタが呼び出されますdelete obj-しかし、この場合、戻り値を格納する場所があるようobjに、オブジェクトへのポインタであることを宣言する必要がありますmyClassからnew

于 2013-04-28T22:21:43.483 に答える
2

あなたの例では、メモリを再利用できるとは思いません。

obj は、*(new myClass()) で作成した無名クラスのコピーです。「obj」はスタックに割り当てられます...ヒープ(新しい割り当て元)には割り当てられません。

&obj を削除しようとすると、作成したコピーのスタック メモリを削除しようとしています。

次のようなものを試してください

myClass *obj = new myClass(); // memory is allocated from the heap and a pointer returned
myClass copyOfObj = *obj; // memory is allocated on the stack. a *shallow* copy of obj is made

delete obj.
于 2013-04-28T22:21:34.623 に答える
1
myClass obj= *(new myClass());

これにより、最初にmyClassという名前の自動保存期間を持つオブジェクトが作成されobjます。このオブジェクトは式 によって初期化されます*(new myClass())。この式は、オブジェクトを動的に割り当ててmyClassから、そのオブジェクトへのポインターを逆参照します。したがって、ここで最終的に行うことは、オブジェクトを動的に割り当ててから、それを にコピーすることobjです。

動的に割り当てられたオブジェクトを追跡できなくなりました。それは良いことではありません。実行delete &obj;すると、自動オブジェクトのアドレスのみが取得され、それが破棄されますがdelete、動的に割り当てられたオブジェクトでのみ使用する必要があります。

あなたは参照になるように変更することができobj、それはうまくいくでしょう:

myClass& obj = *(new myClass());

これにより、動的に割り当てられたオブジェクトがコピーされないようになります。ただし、これは良い考えではありません。がdobjでなければならないオブジェクトを参照しているという事実を隠します。delete代わりに、ポインター自体を保存することをお勧めします。

myClass* obj = new myClass();
// ...
delete obj;

またはさらに良いのは、 のようなスマート ポインターを使用することstd::unique_ptr<myClass>です。

またはさらに良いことに、両方とも動的に割り当てないでください。自動オブジェクトを使用するだけです:

myClass obj;
// No need to allocate or delete anything
于 2013-04-28T22:23:34.510 に答える
1
myClass obj= *(new myClass());

その行:

  1. myClass自動保存期間で のインスタンスを作成します。
  2. のインスタンスを動的に割り当てますmyClass
  3. 返されたポインタを逆参照し、オブジェクトを にコピーしますobj。動的に割り当てられたオブジェクトへのポインタが破棄され、メモリ リークが発生します。
  4. delete自動保存期間を持つローカル変数へのポインターを呼び出すと、未定義の動作が発生します。このオブジェクトは、newまたは のバリアントでは割り当てられませんでしnewた。

コードは次のようになります。

myClass *p = new myClass();
// use p
delete p;

おそらく動的メモリ割り当てはまったく必要ないので...

myClass obj;  // that's it!

次に、スマート ポインターについて調べます。

std::unique_ptr<myClass> p(new myClass());
// no delete!  unique_ptr handles it for you when it goes 
// out of scope and has the benefit of being exception safe.
于 2013-04-28T22:25:50.660 に答える
1

変数objは、逆参照されたポインターへの参照を保持する必要があるため、後で (奇妙なことに) 削除できます。

myClass& obj;
//     ^

ただし、このように定義する必要はありません。代わりに、メモリへのポインターを定義できます。

myClass* obj = new myClass();

次の方法で削除します。

delete obj;

または、さらに良いことに、次のようなメモリ管理ツールを使用できますstd::unique_ptr

std::unique_ptr<myClass> obj(new myClass);

しかし、私が見る限り、ここでは動的メモリは実際には使用されません。通常の変数としてインスタンス化するだけです。

myClass obj;
于 2013-04-28T22:22:26.033 に答える