#c #syntax #memory-leaks
#c #синтаксис #утечки памяти
Вопрос:
У меня есть следующий код
void foo()
{
char* pcBlock = new char[1000];
...
delete[] pcBlock;
...
pcBlock = new char[100000];
...
delete[] pcBlock;
}
Приведет ли приведенный ниже код к утечке памяти?
void foo()
{
char* pcBlock = new char[1000];
...
pcBlock = new char[100000];
...
delete[] pcBlock;
}
Комментарии:
1. Используйте std::string или std::vector<char> и попрощайтесь с ручным управлением памятью и утечками памяти.
2. @unapersson есть много веских причин НЕ использовать std::vector / std::string для некоторых целей.
3. Буферы фиксированного размера для некоторых целей. Не желающий писать пользовательские распределители STL (и недовольный использованием по умолчанию). Хорошая реализация STL недоступна в целевой системе.
4. @jv42 Операционная система спрашивает о динамическом создании массивов, что и делают string и vector. Я никогда не писал пользовательский распределитель и никогда не ожидал этого, и любой STL, который не может реализовать string и vector, сломан, как и реализация компилятора, которая его содержит. Я не думаю, что их можно классифицировать как «многие» или общие проблемы.
5. Ну, это ваше восприятие мира. Мой отличается. Мне пришлось написать пользовательские распределители, мне пришлось динамически создавать буферы, я знаю о проблемах с реализациями STL по умолчанию в некоторых системах, см. open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html например.
Ответ №1:
Да, вероятно, произошла утечка памяти, если вы этого не сделаете delete[] pcBlock
в первом ...
. Переназначение указателя автоматически не удаляет то, на что он ранее указывал.
Ответ №2:
Операторы «new» и «delete» следует использовать парами. В противном случае использование «new» без «deleting» приводит к утечке памяти.
Ответ №3:
Да, ранее выделенные 1000 байт не освобождаются, и pcBlock заменяется новым набором памяти. Нет способа освободить предыдущие 1000 байт. Итак, это утечка памяти.
Ответ №4:
Да, это, скорее всего, приведет к утечке памяти (если только компилятор не достаточно умен, чтобы исправить это за вас, но большинство этого не сделает).
Возможно, вам следует попытаться каким-то образом перераспределить.
Ответ №5:
Да, так и будет. Вероятно, вы думаете, что массивы будут перекрываться, и поэтому удаление освободит первый массив, но на самом деле они распределены по разным частям памяти.
Ответ №6:
ДА, ЭТО МОЖЕТ ПРИВЕСТИ К УТЕЧКЕ ПАМЯТИ
В C есть одно простое правило: каждый вызов new
должен заканчиваться вызовом delete
в конце. И каждый new[]
-> с delete[]
. В противном случае вы получите утечку памяти. C — это язык, на котором программист должен управлять динамической памятью самостоятельно (или с использованием сторонних библиотек).
Комментарии:
1. Это не отвечает на вопрос
2. @Wins ок, ответ «ДА». Теперь вы довольны?
3. Дело не в том, доволен я или нет. StackOverflow предназначен для вопросов и ответов. Если кто-то задает вопросы, это означает, что ему / ей действительно нужен ответ, который: 1) поможет ему / ей решить проблему или 2) поможет ему / ей понять причину, стоящую за ответом. Но что более важно, ему / ей нужно будет знать окончательный ответ на вопросы «да» / «нет», «истина» / «ложь».
4. @Wins ну, в моем ответе я объяснил причины, по которым это происходит. И для меня причины гораздо полезнее, чем просто да или нет. Отклики заставляют вас думать, а не просто что-то знать.