开发者

C++ how to delete a structure?

Structure I created:

   struct VideoSample
  { 
      const 开发者_如何学Pythonunsigned char * buffer;
      int len;
  };

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

       //...

How now to delete it now?


delete newVideSample;

This won't free any memory you allocated to newVideoSample->buffer though - you have to free it explicitly before deleting.

//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;

Normally this kind of freeing is written in the destructor of the class so that it'll be called automatically when you delete the dynamically created object.

Thanks @steve for mentioning it :)


delete newVideoSample;

But if the new and delete are in the same context, you're probably better off skipping them and just creating it on the stack instead:

VideoSample newVideoSample = {buf, size};

In that case, no cleanup is necessary.


You're looking for the delete keyword:

delete newVideoSample;


delete newVideoSample;

However, consider using a smart pointer that will release the memory automatically, for example:

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


In C++ a structure is the exact same as a class except everything is public by default, where a class is private by default. So a structure can have a destructor and is freed with delete.


Unless I'm missing something, you just use delete:

delete newVideoSample;


delete newVideoSample . In C++ struct is the same as class but with default public fields.


Use delete

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

delete newVideoSample;

There is also an overload i.e delete[]

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

delete [] newVideoSample;

In Modern C++ it is always recommended to use smart pointers. You may want to use boost::shared_ptr<T> from the boost library.


If you intended VideoSample to free its buffer member then VideoSample is a fragile class. It has no way of knowing whether buf was created in the heap using new[] or malloc, or is the address of a variable on the stack.


You created an object of Videosample , so you just need to use use delete..

VideoSample * newVideoSample = new VideoSample;
delete newVideoSample;


To Allocate -> VideoSample * newVideoSample = new VideoSample;

To Delete -> delete newVideoSample;

If you deleting the object in the same context, you better just allocate it on the stack. If you deleting it outside the context don't forget to pass a reference.

And most important, don't delete if your about to exit process, it's pointless :P

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜