在我的主要我有变量:
ProcessManager mng;
MemoryManager mem;
dysk disk;
Run Code Online (Sandbox Code Playgroud)
而我正在尝试使用这些指针(也在主要)
std::shared_ptr<MemoryManager> wsk= std::make_shared<MemoryManager>(mem) ;
std::shared_ptr<dysk> wsk_d = std::make_shared<dysk>(disk);
Run Code Online (Sandbox Code Playgroud)
将这些对象传递给我的antoher对象的实例(通过构造函数:
Interpreter interpreter(wsk,wsk_d);
Run Code Online (Sandbox Code Playgroud)
但看起来intepreter会创建自己的磁盘实例,为什么呢?
class Interpreter
{
private:
std::shared_ptr<PCB> pcb;
std::shared_ptr<MemoryManager> mm;
std::shared_ptr<dysk> disk;
}
Run Code Online (Sandbox Code Playgroud)
这就是它:使用传递的参数传递给合适的构造函数创建一个新的对象.在你的情况下是一个复制构造函数.std::make_shared
那就是声明
std::shared_ptr<MemoryManager> wsk= std::make_shared<MemoryManager>(mem);
Run Code Online (Sandbox Code Playgroud)
相当于
std::shared_ptr<MemoryManager> wsk(new MemoryManager(mem));
Run Code Online (Sandbox Code Playgroud)
如果您希望共享指针引用现有对象,则需要使用eg
std::shared_ptr<MemoryManager> wsk(&mem);
Run Code Online (Sandbox Code Playgroud)
但是这将带来其他问题,因为当最后一个共享指针被破坏时,它将尝试释放内存,这对于不是由其创建的对象是不可能的new
.有两种解决方案:创建一个(或使用现有的)null-deleter,它实际上delete
没有任何东西; 或者让共享指针处理对象的完整所有权(从创建到销毁).
这就是你应该如何看待智能指针,而不是作为一种自我删除的指针,而是在资源所有权方面.