智能指针是种数据类型,可以声明一个智能指针并使用智能指针的构造器来构造一个对象。
使用智能指针管理的对象,在智能指针对象被销毁(例如离开作用域后,因为智能指针是个对象,比如函数调用结束后就会自动销毁)或赋予新的值后,就会自动被销毁,这样的机制提供了自动化的内存管理方式。
#include <iostream>
#include <memory> // 包含智能指针的头文件
class MyClass {
public:
MyClass() { std::cout << "MyClass created\n"; }
~MyClass() { std::cout << "MyClass destroyed\n"; }
void myMethod() { std::cout << "MyClass method called\n"; }
};
int main() {
// 创建一个 unique_ptr 实例,管理一个新的 MyClass 对象
std::unique_ptr<MyClass> myUniquePtr = std::make_unique<MyClass>();
// 使用 -> 操作符来调用 MyClass 的方法
myUniquePtr->myMethod();
// 不需要手动删除对象,当 unique_ptr 离开作用域时,对象会被自动销毁
return 0;
}
上面的例子,通过std::make_unique<MyClass>()方法来构造一个MyClass类对象,并使用智能指针管理,这个方法内填参数,该方法就会根据参数来选择使用MyClass类的哪个构造器。
上面的例子是unique_ptr,这样构造的对象在这唯一的智能指针对象被销毁或赋予新的值后,就会自动被销毁。
int main() {
// 创建一个 shared_ptr 实例,管理一个新的 MyClass 对象
std::shared_ptr<MyClass> mySharedPtr1 = std::make_shared<MyClass>();
{
// 创建另一个 shared_ptr 实例,共享所有权
std::shared_ptr<MyClass> mySharedPtr2 = mySharedPtr1;
// 使用 -> 操作符来调用 MyClass 的方法
mySharedPtr2->myMethod();
// mySharedPtr2 离开作用域并被销毁,但由于 mySharedPtr1 仍然存在,所以对象不会被删除
}
// 现在 mySharedPtr1 也离开作用域并被销毁,对象会被自动删除
return 0;
}
这个例子是shared_ptr,可以有多个shared_ptr共享对某个MyClass对象的所有权,只有所有管理这个MyClass对象的shared_ptr都被销毁或赋予新的值后,这个MyClass对象才会被销毁