shared_ptr的控制块位置取决于创建方式:make_shared时控制块与对象同分配,提升性能;通过原始指针构造时则单独分配控制块,需两次内存操作,效率较低且易引发double free。

shared_ptr
shared_ptr
控制块的位置可以归纳为以下两种主要情况:
控制块和引用计数存储位置解析
1. make_shared创建的对象
使用
make_shared<T>()
例如:
#include <iostream>
#include <memory>
int main() {
auto ptr = std::make_shared<int>(42);
// 控制块和int对象在同一块内存中
return 0;
}这种方式是推荐的用法,因为它在性能和异常安全性方面都更优。
2. 通过原始指针创建 shared_ptr
当使用原始指针(例如
new T()
shared_ptr
例如:
#include <iostream>
#include <memory>
int main() {
int* rawPtr = new int(42);
std::shared_ptr<int> ptr(rawPtr);
// 控制块和int对象分别在不同的内存块中
return 0;
}需要特别注意的是,如果使用同一个原始指针多次创建
shared_ptr
shared_ptr
shared_ptr
使用原始指针创建 shared_ptr 的正确姿势
#include <iostream>
#include <memory>
int main() {
int* rawPtr = new int(42);
std::shared_ptr<int> ptr1(rawPtr, [](int* p){
std::cout << "Custom deleter called" << std::endl;
delete p;
});
std::shared_ptr<int> ptr2 = ptr1; // 正确,共享所有权
return 0;
}为什么make_shared
因为
make_shared
new
shared_ptr
make_shared
new
shared_ptr
make_shared
控制块还存储了什么?
除了引用计数,控制块还可能存储以下信息:
weak_ptr
weak_ptr
shared_ptr
多线程环境下的引用计数
在多线程环境中,引用计数的更新必须是原子操作,以避免竞争条件。
shared_ptr
循环引用问题
shared_ptr
shared_ptr
weak_ptr
weak_ptr
如何避免循环引用?
使用
weak_ptr
weak_ptr
shared_ptr
weak_ptr
什么时候应该使用原始指针?
尽管
shared_ptr
shared_ptr
如何选择合适的智能指针?
C++ 提供了多种智能指针,包括
unique_ptr
shared_ptr
weak_ptr
unique_ptr
unique_ptr
shared_ptr
shared_ptr
weak_ptr
shared_ptr
理解
shared_ptr
make_shared
shared_ptr
shared_ptr
以上就是shared_ptr控制块在哪 引用计数存储位置解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号