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