小编nec*_*rek的帖子

为什么 std::make_shared 无法针对已删除运算符 new 的类型进行编译?

我正在尝试编写堆禁止类型,即在堆分配的内存上不可构造的类型。通过删除操作符 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>();
Run Code Online (Sandbox Code Playgroud)

c++ memory-management

4
推荐指数
1
解决办法
159
查看次数

标签 统计

c++ ×1

memory-management ×1