部分12.5/4 [class.free]:
如果查找结果不明确或不可访问,或者查找选择了放置重新分配功能,则程序格式错误.
所以,例如,如果我们写:
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);
}
Run Code Online (Sandbox Code Playgroud)
放置释放函数永远不会被称为删除表达式的评估的一部分.因此,问一下它们的用途是合理的.我们只能通过手动调用它们来调用它们是operator[](void*, std::size_t, std::size_t)不方便的.
在表达式调用在new-expression评估期间抛出时,将调用放置释放函数来清理.此时,传递给放置分配的信息仍然可用,并且可以再次传递给释放功能.稍后,在成功new表达之后,该信息不可用,因此delete语句使用普通的释放函数.
实质上,如果解除分配依赖于传递给放置分配函数的信息,则用户代码负责保留成功创建的对象的信息.另一种方法可能是指定C++实现如何保留它,以便它可以遵守隐含的任何限制.但这会带来复杂性,并且会违反C++的不用付费设计原则.
微软的MFC类框架曾经有一个错误,他们忘了提供一个放置释放函数来匹配他们在调试中使用的放置分配函数new,导致内存泄漏只在调试版本中.愚蠢.
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |