智能指针在C++11以前就已经存在了,使用的是 auto_ptr 作为只能指针,不过 auto_ptr 有一个缺点,拷贝时返回一个左值,不能调用delete[]等,所以在C++11中被弃用了。C++11中使用 unique_ptr 、shared_ptr 、weak_ptr 等智能指针回收堆分配的对象。
我们来看下面的一个例子:
#include <iostream>
#include <memory>
#include <stdlib.h>
int main(int argc, char** argv)
{
std::unique_ptr<int> pUniquePtr(new int(10));
std::cout << *pUniquePtr << std::endl;
std::unique_ptr<int> pUniquePtr2 = std::move(pUniquePtr);
std::cout << *pUniquePtr2 << std::endl;
// std::cout << *pUniquePtr << std::endl; (此句运行崩溃)
system("pause");
return 0;
}
程序的运行结果为
10
10
如果在程序的第14行的注释去掉,则运行崩溃,因为指针对象已经被 pUniquePtr2 窃取了。
下面是一个简单的示例:
#include <iostream>
#include <memory>
#include <stdlib.h>
int main(int argc, char** argv)
{
std::shared_ptr<int> pSharedPtr1(new int(10));
std::cout << *pSharedPtr1 << std::endl;
std::shared_ptr<int> pSharedPtr2 = pSharedPtr1;
std::cout << *pSharedPtr2 << std::endl;
std::cout << *pSharedPtr2 << std::endl;
system("pause");
return 0;
}
程序的运行结果为:
10
10
10
下面是一个简单的示例:
#include <iostream>
#include <memory>
#include <stdlib.h>
int main(int argc, char** argv)
{
std::shared_ptr<int> pSharedPtr1(new int(10));
std::shared_ptr<int> pSharedPtr2 = pSharedPtr1;
std::weak_ptr<int> pWeakPtr = pSharedPtr2;
std::shared_ptr<int> sp = pWeakPtr.lock();
if (sp != nullptr)
std::cout << *sp << std::endl;
sp.reset();
pSharedPtr1.reset();
pSharedPtr2.reset();
std::shared_ptr<int> sp2 = pWeakPtr.lock();
if (sp2 != nullptr)
std::cout << *sp2 << std::endl;
system("pause");
return 0;
}
结果为:
10
当调用
sp.reset();
pSharedPtr1.reset();
pSharedPtr2.reset();
时,其引用计数为0,资源被释放,所以在调用 std::shared_ptr sp2 = pWeakPtr.lock(); 时,返回的对象为 nullptr