首页 > 解决方案 > C++ 删除了新操作符但可以创建 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;
}

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

当我调用 g++ 时,给我一个编译错误,告诉我 new 运算符已被删除。正是我所期望的。

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>();

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

标签: c++shared-ptrnew-operator

解决方案


std::make_shared 使用全局放置新版本的操作符 new,由std::allocator::construct

有必要将对象和原子引用计数器存储在同一块内存中,以便 shared_ptr 模板的工作几乎等同于侵入式智能指针

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


推荐阅读