C++ 删除了新运算符但可以创建 shared_ptr

C++ deleted new operator but can create shared_ptr

我试图寻找答案,但找不到任何有助于理解幕后发生的事情。

假设我们有以下内容:

class Base
{
public:
    virtual int request() = 0; 
    void* operator new(long unsigned int size) = delete;
};


class Derived final : public Base
{
public:
    int request() override;
};

int Derived::request()
{
    return 2;
}

在基础上 class 我删除了 new 运算符,因为我不想创建指针。 我知道这可能没有任何意义,这只是一个实验。

当我调用 g++ 时出现编译错误,告诉我新运算符已被删除。完全符合我的预期。

int main()
{
    auto d =  std::make_unique<Derived>();
    int value = d->request();
    std::cout << "Request value is " << value << "." << std::endl;

    return 0;
}

但是如果我创建 shared_ptr 代码编译并运行良好。

    auto d =  std::make_shared<Derived>();

为什么这段代码在创建共享指针时有效。在这种情况下未使用运算符?

std::make_shared 使用 global placement new version of the operator new, by std::allocator::construct

有必要将对象和原子引用计数器存储在同一个内存块中,这样 shared_ptr 模板的效果几乎等同于 intrusive smart pointer

您无法阻止std::make_shared构造智能指针。