Перераспределение памяти через «новый» в C ++ - PullRequest
9 голосов
/ 01 апреля 2010

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

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

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

А затем выполните это снова, возможно, с strlen(someinput_input).

возвращается другой результат.

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

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

Ответы [ 8 ]

9 голосов
/ 01 апреля 2010

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

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

7 голосов
/ 01 апреля 2010

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

6 голосов
/ 01 апреля 2010

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

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

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

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

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

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

2 голосов
/ 01 апреля 2010

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

2 голосов
/ 01 апреля 2010

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

2 голосов
/ 01 апреля 2010

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

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

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

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

2 голосов
/ 01 апреля 2010

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

1 голос
/ 18 октября 2012

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

...