Какие существуют способы удаления объектов в C ?

#c #memory #memory-management

#c #память #управление памятью

Вопрос:

Как мне очистить объекты из памяти в неуправляемом C ?

Комментарии:

1. Это зависит от того, как вы их создаете.

2. Если вы явно не используете new или malloc (или какой-нибудь сумасшедший strdup :), вам не нужно. Это просто работает!

3. Кстати, это не «неуправляемый C «, это родной C .

Ответ №1:

Это зависит от того, как вы их распределили:

  • new должно соответствовать delete
  • new[] должно соответствовать delete[]
  • malloc должно совпадать с free (хотя вам никогда не придется использовать это в C )

Теперь забудьте все эти вещи, используйте интеллектуальные указатели и прочитайте о RAII.

Комментарии:

1. Использование malloc в C (рассмотрим пользовательские типы) — плохая идея.

2. @Prasoon: Ты далеко впереди 🙂

3. С NULL: ошибка C2679: двоичный файл ‘=’ : не найден оператор, который принимает правый операнд типа ‘int’ (или нет приемлемого преобразования) 940

4. @KnowledgeSeeker: Если у вас возникла конкретная проблема с конкретным кодом, опубликуйте этот код ( минимальный компилируемый пример, который воспроизводит ошибку). Не публикуйте этот код в комментарии. Отредактируйте свой вопрос или задайте новый вопрос о нем.

5. Эта ошибка C2679 предполагает, что вы пытались присвоить null объекту, который не является указателем. Это работает только с примитивными типами, подобными числам, и указателями, а также с объектами, которые имеют явный operator= для типа int. Обратите внимание, что в любом случае присвоение указателю значения null не освобождает память.

Ответ №2:

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

 MyClass *p = new MyClass(); 
// Code

delete p;
  

Ответ №3:

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

Комментарии:

1. удалить объект; удалить [] массив;

2. Вы почти наверняка не получите исключения; это неопределенное поведение.

Ответ №4:

 {
    Object obj = Object;
    // no need to delete this one it will be delete when it gos out of scop
}

Object* obj;
{
    obj = new Object();
    // you need to delete this one because you used the "new" keyword, even if it gos out of scop
}
delete obj;