c++ - 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>();
为什么此代码在创建共享指针时有效。在这种情况下没有使用运算符?
解决方案
std::make_shared 使用全局放置新版本的操作符 new,由std::allocator::construct
有必要将对象和原子引用计数器存储在同一块内存中,以便 shared_ptr 模板的工作几乎等同于侵入式智能指针。
您不能阻止 std::make_shared 构造智能指针。
推荐阅读
- node.js - 无法通过 npm 安装 express
- google-cloud-dataflow - 用于 GenericRecord 的 Apache Beam 编码器
- php - 将 t 转换为 php 中的撇号
- sql - 如何在 PostgresSQL 中为多个模式和表创建触发器函数
- java - 线程中的异常,java 代码将无法正确执行。if/else 语句
- java - SpringBoot Rest Controller集成测试总是给401未授权
- json - Json.net 附加 json 文件
- java - 如何将 ActionEvent 添加到 JButton?井字游戏
- python - 在 Google Dataflow 中使用 FireStore
- clonezilla - 如何绕过 Clonezilla ACPI 错误