C ++, как удалить структуру? - PullRequest
13 голосов
/ 09 ноября 2010

Структура, которую я создал:

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

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

       //...

Как теперь ее удалить сейчас?

Ответы [ 11 ]

22 голосов
/ 09 ноября 2010
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;

Обычно этот вид освобождения записывается в деструктор класса, так что он будет вызываться автоматически при delete динамически созданном объекте.

Спасибо @steve за упоминание этого:)

7 голосов
/ 09 ноября 2010
delete newVideoSample;

Но если new и delete находятся в одном контексте, вам, вероятно, лучше их пропустить и вместо этого просто создать их в стеке:

VideoSample newVideoSample = {buf, size};

В этом случае очистка не требуется.

3 голосов
/ 09 ноября 2010

delete newVideoSample;

Однако рассмотрите возможность использования умного указателя , который автоматически освободит память, например:

std::auto_ptr<VideoSample> newVideoSample(new VideoSample);
3 голосов
/ 09 ноября 2010

Вы ищете ключевое слово delete:

delete newVideoSample;
2 голосов
/ 09 ноября 2010

В C ++ структура точно такая же, как у класса, за исключением того, что по умолчанию все общедоступно, а класс по умолчанию закрытТаким образом, структура может иметь деструктор и освобождается с помощью delete.

2 голосов
/ 09 ноября 2010

Если вы намеревались VideoSample освободить своего члена buffer, то VideoSample является хрупким классом.Он не может знать, был ли buf создан в куче с использованием new[] или malloc, или это адрес переменной в стеке.

2 голосов
/ 09 ноября 2010

Использование delete

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

delete newVideoSample;

Существует также перегрузка , т. Е. delete[]

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

delete [] newVideoSample;

InВ современном C ++ всегда рекомендуется использовать умные указатели.Вы можете использовать boost::shared_ptr<T> из библиотеки повышения.

2 голосов
/ 09 ноября 2010

delete newVideoSample.В C ++ struct совпадает с class, но с открытыми полями по умолчанию.

2 голосов
/ 09 ноября 2010

Если я что-то упустил, вы просто используете delete:

delete newVideoSample;
1 голос
/ 09 ноября 2010

Выделить -> VideoSample * newVideoSample = new VideoSample;

Удалить -> delete newVideoSample;

Если вы удаляете объект в том же контексте, лучше просто выделить его настек.Если вы удаляете его вне контекста, не забудьте передать ссылку.

И самое главное, не удаляйте, если вы собираетесь выйти из процесса, это бессмысленно: P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...