Перераспределение памяти через "new" в C++

быстрый вопрос относительно управления памятью в C++

если я сделаю следующую операцию:

pointer = new char [strlen(someinput_input)+1];

а затем выполните его снова, возможно, с другим результатом, возвращаемым из strlen(someinput_input).

это приводит к тому, что память остается выделенной из предыдущего"new оператор, получающий другой блок памяти кучи от ОС, или это просто перераспределение?

предполагая, что я сделаю окончательный delete pointer[]; будет ли это освобождать любую память, которую я когда-либо выделял через new к этому указателю?

8 ответов


каждый вызов new должны сопоставляется с соответствующим вызовом delete.

в стороне, вы, вероятно, должны рассмотреть возможность использования std::string или даже std::vector<char> (в зависимости от точной ситуации), а не пытаться выделить массивы символов самостоятельно. Тогда тебе не о чем беспокоиться.


когда вы говорите "этот указатель", важно понимать, что значение" этого указателя " будет меняться с каждым выделением. После одного распределения, возможно, это 0x100234, а после следующего распределения это 0x104234. Это означает, что если вы переназначите указатель на новый адрес (новый блок памяти) без освобождения (удаления[]ing) старого блока, вы будете пропускать память в течение всего процесса.


приводит ли это к тому, что память остается выделенной из предыдущего оператора "new"?

Да, это называется утечка памяти.

IE, каждый новый оператор получает еще один блок памяти кучи от ОС, или это просто перераспределение?

Это новый блок памяти из кучи.

предполагая, что я делаю окончательный указатель удаления []; будет ли это освобождать любую память, которую я когда-либо выделено через new для этого указателя?

Если вы " удалите указатель [];", он освободит память, на которую он указывает. Только память от последнего вызова" new char []".


это оставит вашу память болтаться. Вам нужно будет вызвать команду delete [], прежде чем снова использовать оператор " new " на том же указателе (если вы не назначили этот адрес другому указателю).


указатель-это просто переменная, которая хранит адрес памяти. Не подразумевается подсчет ссылок.

каждый новый оператор[] возвращает адрес первого элемента в буфере. Где вы храните этот адрес, или даже если вы храните его вообще не важно.

память будет освобождена только при вызове delete[].

В C++ нет автоматического подсчета ссылок и автоматическое удаление. Когда вы делаете другой распределение, оно не освобождает старого.


короче нет. Каждый раз, когда вы вызываете new, вы выделяете новую память из кучи. В c++ нет магии, которая будет помнить, что вы назначили указатель.


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


Как уже говорилось ранее, новые ahs должны быть сопоставлены с delete. Но если вы можете использовать malloc/free stdlib, есть функция realloc: cplusplus.com