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