gpt4 book ai didi

c++ - 对象创建另一个实例而不是修改指向的实例

转载 作者:行者123 更新时间:2023-11-30 01:03:14 25 4
gpt4 key购买 nike

在我的 main 中,我有变量:

ProcessManager mng;
MemoryManager mem;
dysk disk;

我正在尝试使用这些指针(也在 main 中)

std::shared_ptr<MemoryManager> wsk= std::make_shared<MemoryManager>(mem) ;
std::shared_ptr<dysk> wsk_d = std::make_shared<dysk>(disk);

将这些对象传递给我的另一个对象的实例(通过构造函数:

Interpreter interpreter(wsk,wsk_d);

但看起来解释器创建了自己的磁盘实例,为什么?

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-deleter,它实际上不会删除任何内容;或者让共享指针处理对象的完整所有权(从创建到销毁)。

这才是真正应该看待智能指针的方式,不是将其视为一种自删除指针,而是从资源所有权的角度来看。

关于c++ - 对象创建另一个实例而不是修改指向的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54222809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com