将现有值分配给smart-ptrs?

blu*_*nda 13 c++ tr1 std shared-ptr

我只是在学习智能指针,而且我无法将预先存在的变量位置分配给标准库的共享指针.

例如,假设你有一个int x,你不知道它的值.有了正常的指针,我就是这么做的

int* ptr;
ptr = &x;
Run Code Online (Sandbox Code Playgroud)

我用共享指针尝试了这两个,并且

std::tr1::shared_ptr<int> ptr;
ptr = std::make_shared<int> (&x)
Run Code Online (Sandbox Code Playgroud)

所以我很失落如何做到这一点.

Mik*_*our 24

您(通常)不会将智能指针指向现有变量.智能指针管理动态分配对象的生命周期,在使用后删除它; 将它指向未动态分配的内容如果尝试删除它将导致错误.

您通常会使用newmake_shared创建一个对象,并创建或分配一个智能指针,其结果为:

std::shared_ptr<int> ptr(new int(42)); // Create a new pointer to manage an object
ptr.reset(new int(66));                // Reset to manage a different object
ptr = std::make_shared<int>(53);       // Use `make_shared` rather than `new`
Run Code Online (Sandbox Code Playgroud)

make_shared通常new比较好,因为它可以更好地利用内存并提供更强的异常安全性.


JBL*_*JBL 5

共享指针用于管理动态分配的内存,更准确地说,它们管理此内存的所有权

基本上,智能指针是Ressource Acquisition Is Initialization或 RAII 的具体化。我强烈建议你看看这个原则,因为它对于管理资源所有权非常有用(基本上,每次你需要获取资源并释放它,无论是内存、数据库连接、文件处理程序、互斥锁, 等等。)。

它所做的基本上是保证当有人指向它管理的动态分配的内存时,该内存将可用,并且一旦指向该内存的最后一个(智能)指针超出范围,就会delete被调用。

然后,将智能指针与具有自动存储持续时间的变量一起使用是没有意义的(即,当它们超出范围时或当它们所属的对象超出范围或被删除(如果它是新的) 'd)。