Почему вызов free () для указателя, выделенного с помощью 'new' вызывает повреждение кучи?

Работает ли это на некоторых компиляторах / машинах, но на других это вызывает повреждения кучи и вылетает?

Кто-нибудь имеет представление о том, что происходит под прикрытием? ?

6
задан Gilles 'SO- stop being evil' 17 August 2010 в 18:56
поделиться

3 ответа

C ++ хочет вызвать деструктор объекта, когда вы используете delete , но передача его в free не позволяет этому случиться. Если бы объект содержал другие объекты, то деструкторы этих объектов также не вызывались бы. Если бы в объекте были указатели, они бы не освободились.

Кроме того, C ++ new и delete может фактически запросить больший объем памяти у malloc и использовать дополнительную память для бухгалтерского учета (например, для сохранения адреса деструктор), и поэтому указатель, который вы передали в free , на самом деле не будет тем, который был malloc ed.

18
ответ дан 8 December 2019 в 05:52
поделиться

Стандарт говорит, что вы должны идеально согласовать функцию распределения / освобождения ( new - delete , new [] - удалить [] , malloc - бесплатно ). Теоретически вполне возможно, что некоторые компиляторы реализуют оператор new () как простой malloc () , поэтому это не приведет к сбою, а «только» пропустит вызов деструктора. (что само по себе плохо). Однако operator [] может сохранять количество элементов в выделенном фрагменте памяти, и в этом случае адрес, возвращаемый new [] , указывает внутри некоторого блока, выделенного malloc () (не в начало), что означает, что вы не можете освободить его с помощью free () .

2
ответ дан 8 December 2019 в 05:52
поделиться

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

2
ответ дан 8 December 2019 в 05:52
поделиться
Другие вопросы по тегам:

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