Object 创建另一个实例,而不是修改指向的实例
Object creates another instance instead of modifying the one that's pointed
在我的主要中,我有变量:
ProcessManager mng;
MemoryManager mem;
dysk disk;
我正在尝试使用这些指针(也是主要的)
std::shared_ptr<MemoryManager> wsk= std::make_shared<MemoryManager>(mem) ;
std::shared_ptr<dysk> wsk_d = std::make_shared<dysk>(disk);
将这些对象传递给我的 Antoher 对象的实例(通过构造函数:
Interpreter interpreter(wsk,wsk_d);
但看起来 Intepreter 创建了自己的磁盘实例,为什么?
class Interpreter
{
private:
std::shared_ptr<PCB> pcb;
std::shared_ptr<MemoryManager> mm;
std::shared_ptr<dysk> disk;
}
这就是
std::make_shared
的作用:使用传递的参数创建一个新对象以传递给合适的构造函数。在您的情况下是复制构造函数。
也就是说,声明
std::shared_ptr<MemoryManager> wsk= std::make_shared<MemoryManager>(mem);
相当于
std::shared_ptr<MemoryManager> wsk(new MemoryManager(mem));
如果你想让你的共享指针引用现有对象,那么你需要使用
例如std::shared_ptr<MemoryManager> wsk(&mem);
但这会带来其他问题,因为当最后一个共享指针被破坏时,它将尝试释放内存,这对于不是由 new
创建的对象是不可能的。对此有两种解决方案:创建一个(或使用现有的)null删除器,它实际上不会delete
任何东西;或者让共享指针处理对象的完整所有权(从创建到销毁)。
这就是你应该如何看待智能指针,而不是作为一种自删除指针,而是从资源所有权的角度来看。
相关文章:
- 从C++实例化QML
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 非类型引用参数可以在运行时修改,这是否意味着模板可以在运行时实例化?
- Object 创建另一个实例,而不是修改指向的实例
- 为什么方法应该返回新实例,而不是修改实例本身
- 修改自己类的本地实例
- Lua到c++,用于实体修改的实例化函数
- 访问/修改Qt/QML中某个类型的所有实例
- C++修改超类中声明的实例变量
- 一个中断函数,用于修改动态确定的实例
- 修改参数和/或返回新实例的方法/函数的命名约定
- 成员数组包含类的实例。无法决定在哪里放置修改此类变量的方法
- 如何在修改设计时停止现有代码基类的实例创建