智能指针,是真实原始指针被包装。使用智能指针时,将调用new并分配给你内存,这块内存在某些时候会自动释放
unique pointer 唯一指针#
在一个作用域内,同一个原始指针只能被一个 unique_ptr 管理。它禁止拷贝,这意味着你不能通过赋值来增加它的引用,只能使用 std::move() 将所有权从一个指针转移给另一个。
转让所有权-附加知识点#
#include <iostream>
#include <memory>
class Entity {};
int main() {
// 1. 创建第一个 unique_ptr
std::unique_ptr<Entity> entity = std::make_unique<Entity>();
// 2. 使用 std::move 转移所有权
// 此时,entity 原有的内存所有权交给了 e2
std::unique_ptr<Entity> e2 = std::move(entity);
// 3. 检查状态
if (entity == nullptr) {
std::cout << "entity 现在是空的 (nullptr)" << std::endl;
}
if (e2 != nullptr) {
std::cout << "e2 现在拥有 Entity 的所有权" << std::endl;
}
std::cin.get();
return 0;
} // e2 在这里离开作用域,Entity 被自动销毁
示例-主要知识点#
#include <iostream>
#include <string>
#include <memory>
class Entity
{
public:
//constructor-构造函数
Entity()
{
std::cout << "Created Entity!" << std::endl;
}
//destructor-析构函数
~Entity()
{
std::cout << "Destroyed Entity!" << std::endl;
}
void Print()
{
std::cout << "hello" << std::endl;
}
};
int main()
{
std::cout << "start--" << std::endl;
{
//不允许,禁止隐式转换
//std::unique_ptr<Entity> entity =new Entity();
//允许,直接调用构造函数,但是不建议
//如果创建完原始对象后发生了异常,没有来得及将它放到智能指针对象
//会导致不释放指针指向内存,导致内存泄漏
//std::unique_ptr<Entity> entity(new Entity());
//不会有这问题,因为std::make_unique保证了创建对象和将其
// 放入智能指针是一个原子操作==,中间不会被其他逻辑插入,因
// 此它是异常安全的。
std::unique_ptr<Entity> entity = std::make_unique<Entity>();
entity->Print();
std::unique_ptr<Entity> e2 = std::move(entity);//允许
//std::unique_ptr<Entity> e3 = entity;//不允许,编译报错
/*查看源码
* 复制构造函数和赋值操作符被删除
unique_ptr(const unique_ptr&) = delete;
unique_ptr& operator=(const unique_ptr&) = delete;
*/
}
std::cout << "end--" << std::endl;
std::cin.get();
}
/*
start--
Created Entity!
hello
Destroyed Entity!
end--
*/不允许std::unique_ptr<Entity> entity =new Entity(); 因为禁止隐式转换