对于“C++11 智能指针之shared_ptr代码详解”的攻略,可以分为以下几个部分:
1. 什么是智能指针
智能指针是一种可以自动管理内存的指针,能够避免常见的内存泄漏问题。在C++11标准之前,C++只提供了裸指针,即没有自动内存管理功能的指针。通过引入智能指针,可以减少程序中常见的内存泄漏问题,提高程序的健壮性。
2. shared_ptr的使用
shared_ptr是C++11标准引入的一种智能指针,可以被多个指针对象共享,会自动释放内存。shared_ptr的构造函数可以接受一个原始指针,也可以接受另一个shared_ptr对象。其基本用法如下:
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<int> p1(new int(10)); // 创建并初始化指向int类型的shared_ptr
std::shared_ptr<int> p2 = p1; // 让p2与p1指向同一块内存
std::cout << "p1的引用计数:" << p1.use_count() << std::endl; // 输出引用计数
std::cout << "p2的引用计数:" << p2.use_count() << std::endl; // 输出引用计数
return 0;
}
在上面的例子中,我们创建了两个shared_ptr对象p1和p2,并让它们指向同一块内存。输出结果为
p1的引用计数:2
p2的引用计数:2
说明两个shared_ptr都指向同一块内存,并且都增加了引用计数。当两个shared_ptr对象中的任意一个被销毁时,引用计数会递减,直到引用计数为0时,内存才会被自动释放。
3. shared_ptr的线程安全性
shared_ptr虽然可以被多个指针对象共享,但是它的引用计数是线程安全的。也就是说,当多个线程同时访问同一份数据时,shared_ptr能够保证引用计数的正确性,避免了引用计数异常的问题。
4. 示例
下面是一个示例,演示了shared_ptr的使用和线程安全性:
#include <iostream>
#include <memory>
#include <thread>
void thread_func(std::shared_ptr<int> p) {
std::cout << "子线程中的引用计数:" << p.use_count() << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1)); // 线程休眠1秒
std::cout << "子线程结束" << std::endl;
}
int main() {
std::shared_ptr<int> p(new int(10)); // 创建并初始化指向int类型的shared_ptr
std::cout << "主线程中的引用计数:" << p.use_count() << std::endl;
std::thread t(thread_func, p); // 创建子线程并传入p
t.join(); // 等待子线程结束
std::cout << "主线程中的引用计数:" << p.use_count() << std::endl;
return 0;
}
在上面的例子中,我们创建了一个shared_ptr对象p,并将它传入子线程。在子线程中,我们输出了p的引用计数,并将线程休眠1秒钟。在主线程中,我们也输出了p的引用计数。运行结果为:
主线程中的引用计数:1
子线程中的引用计数:2
子线程结束
主线程中的引用计数:1
从运行结果中可以看出,子线程中的引用计数为2,即使引用计数被多个线程同时访问,它也能够保持正确的值。这说明了shared_ptr的线程安全性。
总结
本文对C++11智能指针之shared_ptr进行了详细讲解,介绍了智能指针的概念、shared_ptr的使用以及shared_ptr的线程安全性。同时,提供了两个示例,清晰地演示了shared_ptr的使用和线程安全性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++11 智能指针之shared_ptr代码详解 - Python技术站