web-dev-qa-db-ja.com

C ++構造を削除する方法?

私が作成した構造:

   struct VideoSample
  { 
      const unsigned char * buffer;
      int len;
  };

   VideoSample * newVideoSample = new VideoSample;
   newVideoSample->buffer = buf;
   newVideoSample->len = size;

       //...

今すぐ削除するにはどうすればよいですか?

16
Rella
delete newVideSample;

ただし、newVideoSample->bufferに割り当てたメモリは解放されません。削除する前に明示的に解放する必要があります。

//Free newVideSample->buffer if it was allocated using malloc
free((void*)(newVideSample->buffer));

//if it was created with new, use `delete` to free it
delete newVideSample->buffer;

//Now you can safely delete without leaking any memory
delete newVideSample;

通常、この種の解放はクラスの destructor に書き込まれるため、動的に作成されたオブジェクトをdeleteしたときに自動的に呼び出されます。

言及してくれてありがとう@steve :)

26
Amarghosh
delete newVideoSample;

しかし、newdeleteが同じコンテキストにある場合は、それらをスキップして、代わりにスタックに作成する方がよいでしょう。

VideoSample newVideoSample = {buf, size};

その場合、クリーンアップは必要ありません。

7
aschepler

あなたはdeleteキーワードを探しています:

delete newVideoSample;
3
SLaks

delete newVideoSample;

ただし、メモリを自動的に解放する スマートポインタ の使用を検討してください。次に例を示します。

std::auto_ptr<VideoSample> newVideoSample(new VideoSample);
3
vitaut

VideoSampleがbufferメンバーを解放することを意図した場合、VideoSampleは壊れやすいクラスです。 bufnew[]またはmallocを使用してヒープ内に作成されたか、スタック上の変数のアドレスであるかを知る方法はありません。

2
dripfeed

C++では、構造はクラスとまったく同じですが、デフォルトではすべてがパブリックであり、クラスはデフォルトでプライベートです。したがって、構造体はデストラクタを持つことができ、削除によって解放されます。

2
robev

私が何かを逃していない限り、あなたはdeleteを使うだけです:

delete newVideoSample;
2
Justin Niessner

delete newVideoSample。 C++では、structclassと同じですが、デフォルトのパブリックフィールドがあります。

2
Abyx

delete を使用します

VideoSample * newVideoSample = new VideoSample;
//.. stuffs

delete newVideoSample;

overload もあります。つまり、delete[]

VideoSample * newVideoSample = new VideoSample[n];
//.. stuffs

delete [] newVideoSample;

最新のC++では、常にスマートポインターを使用することをお勧めします。 boost::shared_ptr<T>はboostライブラリから。

2
Prasoon Saurav

割り当てるには-> VideoSample * newVideoSample = new VideoSample;

削除するには-> delete newVideoSample;

同じコンテキストでオブジェクトを削除する場合は、スタックに割り当てる方がよいでしょう。コンテキスト外で削除する場合は、参照を渡すことを忘れないでください。

そして最も重要なのは、プロセスを終了しようとしている場合は削除しないでください、それは無意味です:P

1
djTeller

* * Videosampleのオブジェクトを作成するので、削除を使用します。

VideoSample * newVideoSample = new VideoSample;削除newVideoSample; * *

0
Satyam