с question new delete

#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 ну, в моем ответе я объяснил причины, по которым это происходит. И для меня причины гораздо полезнее, чем просто да или нет. Отклики заставляют вас думать, а не просто что-то знать.