文章目录
C++智能指针是一种用于自动管理动态分配的内存的机制,它通过自动删除所指向的对象来防止内存泄漏。C++11标准引入了三种智能指针:std::unique_ptr
、std::shared_ptr
和std::weak_ptr
。以下是这些智能指针的详解、解决思路、解决方法以及代码示例。
1. std::unique_ptr
解决思路
std::unique_ptr
用于表示对动态分配对象的独占所有权。在同一时间,只能有一个unique_ptr
指向某个对象。当unique_ptr
被销毁(如离开其作用域)时,它所指向的对象也会被自动删除。
解决方法及代码示例
#include <iostream>
#include <memory>
struct Foo {
Foo() { std::cout << "Foo constructor\n"; }
~Foo() { std::cout << "Foo destructor\n"; }
};
int main() {
std::unique_ptr<Foo> ptr(new Foo()); // 自动分配和初始化Foo对象
// ... 使用ptr
// 离开作用域时,ptr被销毁,Foo对象也被自动删除
return 0;
}
2. std::shared_ptr
解决思路
下滑查看解决方法
std::shared_ptr
用于表示对动态分配对象的共享所有权。多个shared_ptr
可以指向同一个对象,并使用引用计数来跟踪该对象有多少个shared_ptr
指向它。当最后一个指向该对象的shared_ptr
被销毁时,对象才会被自动删除。
解决方法及代码示例
#include <iostream>
#include <memory>
struct Foo {
Foo() { std::cout << "Foo constructor\n"; }
~Foo() { std::cout << "Foo destructor\n"; }
};
int main() {
std::shared_ptr<Foo> ptr1(new Foo()); // ptr1指向Foo对象
std::shared_ptr<Foo> ptr2 = ptr1; // ptr2也指向同一个Foo对象
// ... 使用ptr1和ptr2
// 当ptr1和ptr2都离开作用域并被销毁时,Foo对象才会被自动删除
return 0;
}
3. std::weak_ptr
解决思路
std::weak_ptr
是对std::shared_ptr
的一个补充,它持有对对象的弱引用,即不增加对象的引用计数。它主要用于解决shared_ptr
之间的循环引用问题,从而防止内存泄漏。
解决方法及代码示例
#include <iostream>
#include <memory>
struct Foo;
struct Bar {
std::weak_ptr<Foo> fooPtr;
~Bar() { std::cout << "Bar destructor\n"; }
};
struct Foo {
std::shared_ptr<Bar> barPtr;
~Foo() { std::cout << "Foo destructor\n"; }
};
int main() {
std::shared_ptr<Foo> fooPtr = std::make_shared<Foo>();
fooPtr->barPtr = std::make_shared<Bar>();
fooPtr->barPtr->fooPtr = fooPtr;
// 如果没有weak_ptr,这里会发生循环引用,导致内存泄漏
// 但由于使用了weak_ptr,Foo和Bar对象在离开作用域时都会被正确销毁
return 0;
}
注意:在实际编程中,应谨慎使用智能指针,特别是std::shared_ptr
,以避免不必要的性能开销和可能的循环引用问题。在可能的情况下,优先考虑使用std::unique_ptr
或std::make_unique
(C++14引入)来管理动态分配的内存。