自学网站建设教程,注册安全工程师查询官网,怎么进行推广,提升学历是什么意思以对象管理资源 有这样一段代码#xff1a; class A
{
public:A* create(){...}};
class B :public A
{
public:A* ptr create();...delete ptr;
}; 我们定义了ptr去接收create()函数的返回值#xff0c;并且在最后进行了回收资源。看似是没问题的。但是实际上有很多隐患 class A
{
public:A* create(){...}};
class B :public A
{
public:A* ptr create();...delete ptr;
}; 我们定义了ptr去接收create()函数的返回值并且在最后进行了回收资源。看似是没问题的。但是实际上有很多隐患 1.delete前的...或许有一个过早的return语句 2.delete语句位于某个循环内也许会进行过早的goto或者break 3.delete前的...或许有一个异常抛出 所以这样写并不是最佳的。 那如何写呢 引入C11的智能指针 class B :public A
{
public:auto_ptrA ptr(create());...}; 不论控制流如何离开区块一旦对象被销毁其析构函数自然会被自动调用于是资源被释放 但是auto_ptr 的劣势也很明显如果它被拷贝了并且同时指向一块内存当其中一个指针释放这块资源时另一个指针就会变成野指针。
怎么办 利用其他的智能指针 shared_ptr : 利用计数的思想当多个指针同时管理一块资源时每释放一个指针计数减一直到0便释放资源。避免了野指针的问题。 unique_ptr: 不允许拷贝更杜绝了以上问题。 weak_ptr: 针对unique_ptr的缺陷(循环引用)进行填补. 所以
1.为了防止资源泄漏请使用RAII对象
2.尽量少使用auto_ptr