operator new and delete
发布日期:2025-04-29 07:44:52 浏览次数:14 分类:精选文章

本文共 2849 字,大约阅读时间需要 9 分钟。

Effective C++: ??????C++?????

Effective C++??C++???????????????????????????????????C++??????????????????????????????????????

1. ???????

?C++??????? deallocation ??????????????????????????????????????????????????????????????????????????????????

???? std::new_handler ??????????????? deallocation ?????????????????

class NewHandlerHolder {public:    explicit NewHandlerHolder(std::new_handler nh)        : handler(nh) {}    ~NewHandlerHolder() {        std::set_new_handler(handler);    }private:    std::new_handler handler;    NewHandlerHolder(const NewHandlerHolder& other);    NewHandlerHolder& operator=(const NewHandlerHolder& other);};

??? NewHandlerHolder ????????????????????

2. ?????????

????????????????????????????????????????????

template
class NewHandlerSupport {public: static std::new_handler set_new_handler(std::new_handler p) throw(); static void* operator new(std::size_t size) throw(std::bad_alloc); static void* operator new(std::size_t size, std::nothrow_t& nt) throw();private: static std::new_handler currentHandler;};template
std::new_handler NewHandlerSupport
::currentHandler = NULL;template
std::new_handler NewHandlerSupport
::set_new_handler(std::new_handler p) throw() { std::new_handler oldHandler = currentHandler; currentHandler = p; return oldHandler;}template
void* NewHandlerSupport
::operator new(std::size_t size, std::nothrow_t& nt) throw() { NewHandlerHolder h(std::set_new_handler(currentHandler)); return ::operator new(size, nt);}template
void* NewHandlerSupport
::operator new(std::size_t size) throw(std::bad_alloc) { NewHandlerHolder h(std::set_new_handler(currentHandler)); return ::operator new(size);}

??? NewHandlerSupport ???????????????????????????????

3. ?????????

???? NewHandlerSupport ??????????????????????????????????????? std::nothrow ??? crash?

template
void* NewHandlerSupport
::operator new(std::size_t size, std::nothrow_t& nt) throw() { NewHandlerHolder h(std::set_new_handler(currentHandler)); return ::operator new(size, nt);}

???????????????????? std::nothrow ????????? crash?

4. ????

????????????????????????????

class Widget : public NewHandlerSupport
{public: Widget() {} ~Widget() { std::cout << "Widget Destructor Enter" << std::endl; }};

?? Widget ???? NewHandlerSupport<Widget>????????????? deallocation ????

???????????????

int main() {    std::cout << "Hello World!" << std::endl;    Widget::set_new_handler(NULL);    std::tr1::shared_ptr
pW(new Widget); Widget* pw2 = ::new (std::nothrow) Widget; if (pw2) { delete pw2; } return 0;}

???????????????????????????

5. ??

?????????????????????????????????????????Effective C++ ??????????????????????C++???

??????????????????????????

上一篇:operator new 与 operator delete
下一篇:Operations Manager 2007 R2系列之仪表板(多)视图

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2026年05月27日 07时54分13秒