1.本文复用的代码如下(区别在main函数):
#include <iostream>
#include <memory>
class A
{
public:
A(){std::cout << "A" << std::endl;}
~A(){std::cout << "~A" << std::endl;}
};
// 堆区开辟A类的空间
A* CreateA()
{
return new A;
}
//A管理类
class AManager
{
public:
AManager(A* Geta):a(Geta){std::cout << "AManager" << std::endl;}
~AManager(){delete a; std::cout << "~AManager" << std::endl;}
private:
A* a;
};
2.成对的new 和delete 也可能造成内存泄漏
int main()
{
A* a = new A;
//... 程序抛出异样,goto语句,提前return等
delete a;
}
3.解决思路1:栈对象管理堆区资源
int main()
{
//栈对象管理堆区资源
AManager manager(CreateA());
return 0;
}
A
AManager
~A
~AManager
4.解决思路2:智能指针管理如unique_ptr模板类管理
int main()
{
std::unique_ptr<A> uniquePtrManager(CreateA());
return 0;
}
A
~A
5.unique_ptr reset()和release()的区别
unique_ptr reset()释放掉管理的堆内存
int main()
{
std::unique_ptr<A> uniquePtrManager(CreateA());
uniquePtrManager.reset();
std::cout << "end............" << std::endl;
return 0;
}
A
~A
end............
unique_ptr release()造成内存泄漏
int main()
{
std::unique_ptr<A> uniquePtrManager(CreateA());
uniquePtrManager.release();
std::cout << "end............" << std::endl;
return 0;
}
A
end............
int main()
{
std::unique_ptr<A> uniquePtrManager(CreateA());
std::cout << "end............" << std::endl;
std::unique_ptr<A> getUniquePtr(uniquePtrManager.release());
return 0;
}
A
end............
~A