【发布时间】:2020-01-17 22:39:11
【问题描述】:
我正在尝试编写堆禁止类型,即在堆分配的内存上不可构造的类型。通过删除 operator new 和placement new 我想我可以做到这一点。但是使用std::make_shared 创建共享指针仍然可以编译。
为什么std::make_shared<A>()删除新的操作符后编译失败?
#include <memory>
class A {
public:
void* operator new(size_t) = delete;
void* operator new(size_t, void*) = delete;
void* operator new [] (size_t) = delete;
};
// Regular new fails
A* a1 = new A();
// Placement new fails
void* pv = std::malloc(sizeof(A));
A* a2 = new (pv) A();
// make_shared works
std::shared_ptr<A> a3 = std::make_shared<A>();
【问题讨论】:
标签: c++ memory-management