Zac*_*Saw 7 c++ operator-overloading new-operator delete-operator
#include <new>
#include <cstdlib>
#include <iostream>
#include <stdexcept>
struct foo {};
inline void* operator new(size_t size, foo*) throw (std::bad_alloc)
{
std::cout << "my new " << size << std::endl;
return malloc(size);
}
inline void operator delete(void* p, foo*) throw()
{
std::cout << "my delete" << std::endl;
free(p);
}
int main()
{
delete new((foo*)NULL) foo;
}
Run Code Online (Sandbox Code Playgroud)
输出(通过ideone):
my new 1
Run Code Online (Sandbox Code Playgroud)
我的想法是,C++会释放一个带有附加参数的对象,并且匹配删除相同的参数,但我显然是不正确的.
获取上述代码调用重载删除的正确方法是什么?
当您使用任何形式的placement new时,除了std::nothrow_t版本之外,您需要显式地销毁对象并使用您认为合适的任何方式释放其内存.operator delete()但是,仍然需要存在重载版本,因为如果对象的构造引发异常,则使用它!在这种情况下,不会返回任何指针,因为抛出了异常.因此,在这个分配过程中要完成摆脱记忆.
也就是说,你main()应该看起来像这样:
int main()
{
foo* p = new (static_cast<foo*>(0)) foo;
p->~foo();
operator delete(p, static_cast<foo*>(0));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3064 次 |
| 最近记录: |