作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
#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;
}
输出(via ideone):
my new 1
我的想法是,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));
}
关于c++ - 使用可选参数重载 new 和 delete 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13503902/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!