C++ 是否将现有值分配给智能PTR?
我刚刚学习了智能指针,但在将变量的预先存在的位置分配给标准库的共享指针时遇到了问题 例如,假设您有一个int x,您不知道它的值。用普通的指针,我就这么做了C++ 是否将现有值分配给智能PTR?,c++,std,shared-ptr,tr1,C++,Std,Shared Ptr,Tr1,我刚刚学习了智能指针,但在将变量的预先存在的位置分配给标准库的共享指针时遇到了问题 例如,假设您有一个int x,您不知道它的值。用普通的指针,我就这么做了 int* ptr; ptr = &x; 我用共享指针尝试了这两种方法 std::tr1::shared_ptr<int> ptr; ptr = std::make_shared<int> (&x) std::tr1::shared\u ptr ptr; ptr=std::使_共享(&x) 所以我
int* ptr;
ptr = &x;
我用共享指针尝试了这两种方法
std::tr1::shared_ptr<int> ptr;
ptr = std::make_shared<int> (&x)
std::tr1::shared\u ptr ptr;
ptr=std::使_共享(&x)
所以我完全不知道该怎么做。您不应该创建指向未动态分配的对象的智能指针。否则,智能指针可能会尝试删除分配的内存,从而导致错误 您(通常)不会将智能指针指向现有变量。智能指针管理动态分配对象的生存期,在使用后将其删除;如果将其指向未动态分配的内容,则尝试删除该内容时将导致错误 您通常会使用
new
或make_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`
std::shared_ptr ptr(新int(42));//创建新指针以管理对象
ptr.重置(新整数(66));//重置以管理其他对象
ptr=std::使_共享(53);//使用'make_shared'而不是'new'`
make_shared
通常比new
更可取,因为它可以更好地利用内存并提供更强的异常安全性。共享指针用于管理动态分配的内存,更准确地说,它们管理此内存的所有权
基本上,智能指针是RAII的具体化。我强烈建议您看看这个原则,因为它对于管理资源所有权非常有用(基本上,每次您需要获取并释放资源时,无论是内存、数据库连接、文件处理程序、互斥体等)
它所做的基本上是保证当有人指向它管理的动态分配内存时,该内存将可用,并且只要指向该内存的最后一个(智能)指针超出范围,就会调用delete
然后,将智能指针与具有自动存储持续时间的变量一起使用是没有意义的(即,当它们超出范围或它们所属的对象本身超出范围或被删除(如果它是新的)时,它们将被删除).一旦共享\u ptr的参考计数器达到零,该对象将被最后一个共享\u ptr删除。使用智能指针,您可以指定删除该对象的函数 Deleter是一个简单的函数(默认为通常的运算符delete),必须通过模板参数(请参阅)静态地或通过构造函数参数(请参阅)动态地绑定到智能指针
//通过共享ptr动态执行:
//共享\u ptr共享指向删除器的指针
//因为它们已经共享一个用于引用计数的公共数据结构。
自动忽略=[](int*o){
std::coutIt不太可能希望将变量的地址传递给共享指针。共享指针的要点是它们管理动态分配的对象。
// dynamically via shared_ptr:
// shared_ptrs share the pointer to the Deleter
// because they already share a common data structure for reference counting.
auto ignore = [](int* o){
std::cout<<"i will refuse to delete this object: " << o << "\n";
std::cout<<"not my responsibility." <<std::endl;
};
std::shared_ptr<int> sptr(&x,ignore);
//statically via unique_ptr:
// actually, the unique_ptr is as data structure not more than a regular pointer.
// but a pointer with special copy-constructor and destructor,
// which will most likely be inlined.
// there is no space to store a reference to a Deleter dynamically.
struct IgnorantDeleter{
void operator()(int* o){
std::cout<<"who ate my cake? " << o << "\n";
std::cout<<"but i baked it." <<std::endl;
}
};
std::unique_ptr<int,IgnorantDeleter> uptr(&x);