2015-07-19 1 views
0

Раздел 12.5/4 [class.free]:Какие функции для освобождения места размещения были введены?

Если результат поиска является неоднозначным или недоступен, или если поиска выбирает функцию размещения Deallocation, программа плохо сформирована.

Так, например, если мы пишем: функция открепление

class A 
{ 
public: 
    void* operator new (std::size_t count, std::size_t msg, std::size_t mmsg); 
    void operator delete (void* ptr, std::size_t msg, std::size_t mmsg); 
}; 

void* A::operator new (std::size_t sz, std::size_t msg, std::size_t mmsg){ 
    std::printf("global op new called, message = %lu, %lu", msg, mmsg); 
    return std::malloc(sz); 
} 

void A::operator delete (void* ptr, std::size_t msg, std::size_t mmsg){ 
    std::printf("global op new called, message = %lu, %lu", msg, mmsg); 
} 

live example

Размещение никогда не будет вызван в качестве части оценки удаления выражения. Поэтому разумно спросить, для чего они были введены. Мы можем называть их только посредством ручного вызова на operator[](void*, std::size_t, std::size_t), который не является удобным.

ответ

5

Функция освобождения места вызывается для очистки при вызове конструктора во время оценки выражения new. На этом этапе информация, которая была передана распределению места размещения, по-прежнему доступна и может быть снова передана функции освобождения. В более поздний момент после успешного вывода new эта информация недоступна, поэтому обычная функция освобождения используется оператором delete.


По существу, если открепление зависит от информации, переданной функции распределения размещения, то пользовательский код отвечает за сохранение этой информации для успешного созданного объекта. Альтернативой могло быть определение того, как реализация C++ сохранит ее, чтобы она могла соответствовать любым ограничениям, которые подразумевались. Но это создало бы сложность и нарушало бы принцип дизайна «Не платите за то, что вы не используете» на C++.


рамки класса MFC от Microsoft когда-то была ошибка, когда они забыли поставить функцию размещения открепления, чтобы соответствовать функциям распределения размещения они использовали в их отлаживать new, в результате утечки памяти только в отладочной версии. Глупо.

Смежные вопросы