说实话以前用这个很少,一个指针打天下,不过都智能了,分配了就不管了,想来还是很方便。。。
1 unique_ptr
代码示例:
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() { std::cout << "MyClass constructor\n"; }
~MyClass() { std::cout << "MyClass destructor\n"; }
void display() { std::cout << "Displaying MyClass\n"; }
};
int main() {
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(); // 创建智能指针
ptr1->display();
// 转移所有权
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
if (!ptr1) {
std::cout << "ptr1 is null\n";
}
ptr2->display();
// 自动释放内存
return 0;
}
结果:
ubuntu@VM-8-10-ubuntu:~/test/cpp$ ./a.out
MyClass constructor
Displaying MyClass
ptr1 is null
Displaying MyClass
MyClass destructor
2 shared_ptr
代码示例:
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() { std::cout << "MyClass constructor\n"; }
~MyClass() { std::cout << "MyClass destructor\n"; }
void display() { std::cout << "Displaying MyClass\n"; }
};
int main() {
std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>(); // 创建智能指针
ptr1->display();
{
std::shared_ptr<MyClass> ptr2 = ptr1; // 共享所有权
std::cout << "ptr2 use count: " << ptr2.use_count() << "\n";
ptr2->display();
} // ptr2超出作用域,不影响对象的生存
std::cout << "ptr1 use count: " << ptr1.use_count() << "\n";
// 自动释放内存
return 0;
}
结果:
ubuntu@VM-8-10-ubuntu:~/test/cpp$ ./a.out
MyClass constructor
Displaying MyClass
ptr2 use count: 2
Displaying MyClass
ptr1 use count: 1
MyClass destructor
3 weak_ptr
代码示例:
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() { std::cout << "MyClass constructor\n"; }
~MyClass() { std::cout << "MyClass destructor\n"; }
void display() { std::cout << "Displaying MyClass\n"; }
};
int main() {
std::shared_ptr<MyClass> sharedPtr = std::make_shared<MyClass>(); // 创建智能指针
std::weak_ptr<MyClass> weakPtr = sharedPtr; // 创建弱引用
std::cout << "sharedPtr use count: " << sharedPtr.use_count() << "\n";
if (auto tempPtr = weakPtr.lock()) { // 转换为std::shared_ptr
tempPtr->display();
std::cout << "tempPtr use count: " << tempPtr.use_count() << "\n";
} else {
std::cout << "Object is no longer available\n";
}
sharedPtr.reset(); // 释放sharedPtr
if (auto tempPtr = weakPtr.lock()) { // 再次尝试转换
tempPtr->display();
} else {
std::cout << "Object is no longer available\n";
}
return 0;
}
结果
ubuntu@VM-8-10-ubuntu:~/test/cpp$ ./a.out
MyClass constructor
sharedPtr use count: 1
Displaying MyClass
tempPtr use count: 2
MyClass destructor
Object is no longer available
4 小结
| 名称 | 用法 |
|
unique_ptr | 指向单一结构,比如分配的数组,链表,一个设备等等。 |
|
shared_ptr | 需要多个类都操作这个数据。比如说结构在多个类都要用。然后就是工厂类肯定要用。观察者也会用到。 |
|
weak_ptr | 主要是解决shared_ptr会出现的循环引用,导致内存泄漏的问题。 |
感觉刚开始用unique_ptr就够了,实在解决不了的场景再看看。。。

2781

被折叠的 条评论
为什么被折叠?



