您的位置:首页 > 编程语言 > C语言/C++

《Effective C++》读书笔记之item52:写了placement new也要写placement delete

2012-09-03 21:06 351 查看
1.当在类中声明了一个placement new(一个特定位置上的new),它接受了除std::size_t外的其他变量作为参数,则必须同样声明一个placement delete并且其参数与placement new相同以取得对应关系,这样当内存分配失败时C++编译器将调用与placement new相匹配的placement delete归还内存。

注意placement delete只有在“伴随placement new调用而触发的构造函数”出现异常时才会被调用,对一个已经存在的指针进行delete时不会调用它。

2.应当避免class专属的new掩盖客户期望的其他new,如通用版本的new或其基类中的new,方法是在适当的作用域中使用using声明式。

缺省情况下C++在global作用域中提供以下三种形式的operator new:

void* operator new(std::size_t) throw(std::bad_alloc);	//normal new
void* operator new(std::size_t, void*) throw();	//placement new
void* operator new(std::size_t, const std::nothrow_t&) throw();	//nothrow new

如果在类内声明专属的operator new,会遮掩上述版本。一般情况下应当保证这些函数在类外可用,同时应当声明成对的operator new和operator delete。可以声明一个基类包含所有上述函数及其对应的operator delete函数,自己定义类继承这个基类并使用using声明式以取得标准形式,使其与自定义版本不发生命名冲突。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐