智能指针unique_ptr
#include <iostream>
#include <memory>
#include "demo/AA.cpp"
int main() {
// 1)声明与初始化
std::cout << "Hello, World!" << std::endl;
std::unique_ptr<AA> p0(new AA("西施0")); // 方法一: 分配内存并初始化
std::unique_ptr<AA> p1 = std::make_unique<AA>("冰冰1"); // 方法二: C++14标准。
std::cout << "智能指针调用p1->m_name: " << p1->m_name << std::endl;
// 2)用nullptr给unique_ptr赋值将释放对象,空的unique_ptr==nullptr
p1 = nullptr;
if (p1 == nullptr) {
std::cout << "智能指针调用p1 为空(nullptr): " << std::endl;
}
// 3)release()释放对原始指针的控制权,将unique_ptr置为空,返回裸指针。
// (可用于把unique_ptr传递给子函数,子函数将负责释放对象)
// 4)std::move()可以转移对原始指针的控制权。
// (可用于把unique_ptr传递给子函数,子函数形参也是unique_ptr)
// 5)reset()释放对象。
// p0.reset();
p0.reset(new AA("bbb2")); // 释放p0指向的资源对象,同时指向新的对象。
std::cout << "p0释放了对象 , 同时又指向新的对象." << "" << std::endl;
// 6)unique_ptr不是绝对安全,如果程序中调用exit()退出,
// 全局的unique_ptr可以自动释放,但局部的unique_ptr无法释放
return 0;
}
#include <iostream>
#include <string>
class AA
{
public:
std::string m_name;
AA() { std::cout << m_name << "调用构造函数AA()。\n"; }
AA(const std::string & name) : m_name(name) { std::cout << "调用构造函数AA("<< m_name << ")。\n"; }
~AA() { std::cout << m_name << "调用了析构函数~AA(" << m_name << ")。\n"; }
};