C ++ как удалить структуру?

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

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

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

       //...

Как теперь его удалить?


person Rella    schedule 09.11.2010    source источник
comment
Кому принадлежит буфер? Шансы на то, что вам также понадобится деструктор, отличны от нуля.   -  person Hans Passant    schedule 09.11.2010


Ответы (11)


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 за упоминание об этом :)

person Amarghosh    schedule 09.11.2010
comment
пятерки мне C2664 на бесплатном (newVideSample- ›буфер); линия. что-то вроде этого не может преобразовать const unsigned char в void * - person Rella; 09.11.2010
comment
Это заслуживает -1 - за использование free, не зная, откуда взялась память, и за то, что не рекомендуется делать это в деструкторе, если установлен указатель. Не голосование против, потому что ни в одном другом ответе об этом даже не упоминается. - person Steve Townsend; 09.11.2010
comment
@Kabumbus Я думал, что кастинг будет происходить автоматически - добавьте буфер в (void *), и все будет хорошо. Кроме того, используйте free / delete для buffer, только если вы его выделили - если, как показано в вопросе, буфер был инициализирован указателем, который уже был выделен (и использовался даже после удаления newVideSample), вам не нужно и не следует освободить / удалить - person Amarghosh; 10.11.2010
comment
скорее всего это должен быть delete [] для буфера. но еще раз не знаю. - person Chubsdad; 16.11.2010

delete newVideoSample;

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

VideoSample newVideoSample = {buf, size};

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

person aschepler    schedule 09.11.2010
comment
Да, по умолчанию нет необходимости создавать или удалять объекты. Используйте его только в том случае, если действительно знаете, зачем он вам нужен. - person Nikko; 09.11.2010

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

delete newVideoSample;
person SLaks    schedule 09.11.2010

delete newVideoSample;

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

std::auto_ptr<VideoSample> newVideoSample(new VideoSample);
person vitaut    schedule 09.11.2010

Если я чего-то не упускаю, просто используйте delete:

delete newVideoSample;
person Justin Niessner    schedule 09.11.2010

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

person Abyx    schedule 09.11.2010

Используйте delete.

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

delete newVideoSample;

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

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

delete [] newVideoSample;

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

person Prasoon Saurav    schedule 09.11.2010

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

person dripfeed    schedule 09.11.2010

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

person robev    schedule 09.11.2010

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

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

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

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

person djTeller    schedule 09.11.2010
comment
не удаляйте, если вы собираетесь выйти из процесса, это бессмысленно Нет. Почему это было +2? По крайней мере, чтобы явно delete был самодокументирован и вежлив. Более того, что, если ОС не удаляет объект или один из его ресурсов? Также это гарантирует, что вы избежите ложных срабатываний в анализаторах утечек памяти и т. Д. На самом деле, deleteing не сложно, так что просто делайте это всегда. Если вы начинаете извинять за упущение в ситуациях, которые [пальцы доктора Зла] не имеют значения, вы напрашиваетесь на проблемы, когда забываете delete в ситуации, когда это действительно имеет значение. stackoverflow.com/q/677812/2757035 - person underscore_d; 16.02.2016

* * Вы создаете объект Videosample, поэтому просто используете delete ..

VideoSample * newVideoSample = новый VideoSample; удалить newVideoSample; * *

person Satyam    schedule 05.07.2012