Перераспределение памяти через “новый” в C++

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

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

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

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

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

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

9
задан Unihedron 11 August 2014 в 13:46
поделиться

7 ответов

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

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

9
ответ дан 4 December 2019 в 07:14
поделиться

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

7
ответ дан 4 December 2019 в 07:14
поделиться

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

2
ответ дан 4 December 2019 в 07:14
поделиться

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

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

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

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

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

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

6
ответ дан 4 December 2019 в 07:14
поделиться

Указатель - это просто переменная, которая содержит адрес памяти. Он не выполняет никакого неявного подсчета ссылок.

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

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

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

2
ответ дан 4 December 2019 в 07:14
поделиться

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

2
ответ дан 4 December 2019 в 07:14
поделиться

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

2
ответ дан 4 December 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: