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构造智能指针。
我试图寻找答案,但找不到任何有助于理解幕后发生的事情。
假设我们有以下内容:
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构造智能指针。