c++11&14-智能指针专题
发布日期:2021-05-08 05:59:45 浏览次数:20 分类:精选文章

本文共 2622 字,大约阅读时间需要 8 分钟。

智能指针与内存管理在C++中的应用

在C++开发过程中,内存管理一直是开发者需要面对的一大挑战。动态内存的使用虽然提供了灵活性,但也容易导致内存泄漏或其他内存相关问题。而Java等其他语言通过垃圾回收机制和内存引用机制,解决了这一痛点。C++开发者也终于可以用智能指针来应对这一挑战。

1. 智能指针的概念

智能指针是一种用于管理动态内存的工具,它通过引用计数机制来跟踪对内存块的引用数量。当最后一个引用对象释放时,智能指针会自动释放所管理的内存资源。C++标准库提供了三种主要的智能指针:std::shared_ptrstd::weak_ptrstd::unique_ptr

1.1 std::shared_ptr

std::shared_ptr 是最常用的智能指针类型,它包装了 new 操作符分配的内存资源。与普通指针不同,shared_ptr 允许通过拷贝操作共享同一块内存。以下是使用 shared_ptr 的示例代码:

#include 
#include
class Test {
public:
Test() { std::cout << "Test()" << std::endl; }
~Test() { std::cout << "~Test()" << std::endl; }
};
int main() {
std::shared_ptr
p1 = std::make_shared
();
std::cout << "1 ref: " << p1.use_count() << std::endl;
{
std::shared_ptr
p2 = p1;
std::cout << "2 ref: " << p1.use_count() << std::endl;
}
std::cout << "3 ref: " << p1.use_count() << std::endl;
return 0;
}

1.2 std::weak_ptr

std::weak_ptr 的主要特点是赋值操作不会增加引用计数。它适合观察一个 shared_ptr 管理的对象,而不参与资源管理。weak_ptr 的主要用途是避免强引用带来的循环问题。以下是 weak_ptr 的基本操作示例:

class TestB; class TestA {
public:
TestA() { std::cout << "TestA()" << std::endl; }
void ReferTestB(std::shared_ptr
test_ptr) {
m_TestB_Ptr = test_ptr;
}
~TestA() { std::cout << "~TestA()" << std::endl; }
private:
std::weak_ptr
m_TestB_Ptr;
};
class TestB {
public:
TestB() { std::cout << "TestB()" << std::endl; }
void ReferTestB(std::shared_ptr
test_ptr) {
m_TestA_Ptr = test_ptr;
}
~TestB() {
auto tmp = m_TestA_Ptr.lock();
if (tmp) {
tmp->TestWork();
}
std::cout << "~TestB()" << std::endl;
}
std::weak_ptr
m_TestA_Ptr;
};
int main() {
std::shared_ptr
ptr_a = std::make_shared
(); std::shared_ptr
ptr_b = std::make_shared
(); ptr_a->ReferTestB(ptr_b); ptr_b->ReferTestB(ptr_a); std::cout << "1 ref a: " << ptr_a.use_count() << std::endl; std::cout << "1 ref b: " << ptr_a.use_count() << std::endl; return 0; }

1.3 std::unique_ptr

std::unique_ptr 是一种资源管理方式,它允许对象资源被唯一拥有。与 shared_ptr 不同,unique_ptr 不允许拷贝或重赋值操作,但支持移动操作。以下是 unique_ptr 的基本使用示例:

#include 
#include
int main() {
std::unique_ptr
pInt;
pInt.reset(new int());
int* p = pInt.release();
std::unique_ptr
pArray(new int[3]{1, 3, 3});
return 0;
}

2. 智能指针的总结

智能指针为C++开发者提供了一种更安全、更高效的内存管理方式。通过 std::shared_ptrstd::weak_ptrstd::unique_ptr,开发者可以根据具体需求选择合适的内存管理策略。在使用这些智能指针时,记得遵守它们的特性和使用限制,才能充分发挥它们的优势。

上一篇:c++11&14-STL专题
下一篇:c++11&14-常用属性专题

发表评论

最新留言

不错!
[***.144.177.141]2025年04月07日 05时09分07秒