设为首页 加入收藏

TOP

Effective C++ 条款 52:写了placement new也要写placement delete(二)
2015-07-20 17:35:26 来源: 作者: 【 】 浏览:6
Tags:Effective 条款 写了 placement new delete
lass内声明任何operator news,它会遮掩上述这些标准形式。除非你的意思就是要阻止class的客户使用这些形式,否则确保他们在你生成的任何定制型operator new之外还可用。

解决所有问题的一个简单的做法是,建立一个base class,内含所有正常形式的new和delete:

class StandardNewDeleteForms{ 
public: 
    //normal new/delete 
    static void* operator new(std::size_t size)throw(std::bad_alloc) 
    {return ::operator new(size);} 
    static void operator delete(void* pMemory) throw() 
    {::operator delete(pMemory);} 
    //placement new/delete 
    static void*  operator new(std::size_t size, void* ptr) throw() 
    {return ::operator new(size, ptr);} 
    static void operator delete(void* pMemory, void* ptr)throw() 
    {return ::operator delete(pMemory, ptr);} 
    //nothrow new/delete 
    static void* operator new(std::size_t size, const std::nothrow_t& nt)throw() 
    {return ::operator new(size, nt);} 
    static void operator delete(void* pMemory, const std::nothrow_t&) throw() 
    {::operator delete(pMemory);} 
};

凡是想自定义形式扩充标准形式的客户,可利用继承机制及using声明式取得标准形式:

class Widget: public StandardNewDeleteForms{ 
public: 
    using StandardNewDeleteForms::operator new; 
    using StandardNewDeleteForms::operator delete; 
    static void* operator new(std::size_t size, std::ostream& logStream)throw(std::bad_alloc); 
    static void operator delete(void* pMemory, std::ostream& logStream) throw(); 
};



请记住:

(1)当你写一个placement operator new,请确定也写出了对应的placement operator delete.如果没有这样做。你的程序可能会发生隐微而时断时续的内存泄漏.
(2)当你声明placement new和placement delete。请确定不要无意识地遮掩它们的正常版本.

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ2386 Lake Counting(DFS) 下一篇冒泡排序-插入排序-快速排序-选择..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)
·Redis配置中`require (2025-12-26 03:18:58)
·Asus Armoury Crate (2025-12-26 02:52:33)
·WindowsFX (LinuxFX) (2025-12-26 02:52:30)