传值用于共享所有权,确保对象生命周期;传const引用仅访问对象,效率更高;裸指针适用于零开销场景但风险高;多线程中应传值并同步对象访问。

C++中
shared_ptr
const
在使用
shared_ptr
传值 (Pass by Value): void func(std::shared_ptr<MyClass> obj)
shared_ptr
shared_ptr
传const
const
void func(const std::shared_ptr<MyClass>& obj)
立即学习“C++免费学习笔记(深入)”;
shared_ptr
shared_ptr
shared_ptr
shared_ptr
传非const
const
void func(std::shared_ptr<MyClass>& obj)
shared_ptr
reset()
shared_ptr
shared_ptr
*传裸指针或裸引用 (Pass by Raw Pointer or Raw Reference): `void func(MyClass obj_ptr)
或
shared_ptr
shared_ptr
shared_ptr
shared_ptr
这确实是个值得深思的问题,很多时候,初学者会觉得“传引用更高效”,然后不加区分地使用。但实际上,这两种方式承载着完全不同的语义。
当你将
shared_ptr
void process(std::shared_ptr<Data> data)
process
data
data
shared_ptr
data
shared_ptr
shared_ptr
shared_ptr
而当你选择按const
void inspect(const std::shared_ptr<Data>& data)
inspect
data
data
data
std::shared_ptr<Data> my_copy = data;
所以,关键在于你函数的设计意图:是想共享所有权,还是仅仅想临时访问?这两种选择的背后,是对资源生命周期管理的不同策略。没有绝对的优劣,只有是否符合当前场景的设计需求。我个人经验是,如果拿不准,先考虑
const std::shared_ptr<T>&
shared_ptr
这其实是一个关于信任和责任的边界问题。将
shared_ptr
void do_something(MyObject* obj)
void do_something_else(MyObject& obj)
shared_ptr
那么,什么时候会这么做呢?
一个常见的场景是,当你的函数是一个纯粹的“操作”函数,它只关心对对象进行某个操作,而完全不关心这个对象的创建、销毁或所有权。比如,一个
draw(const Shape& s)
Shape
shared_ptr
draw
Shape
另一个情况是,当你知道你的函数执行周期非常短,并且严格嵌套在shared_ptr
do_something(obj_ptr)
obj_ptr
shared_ptr
然而,这种做法伴随着巨大的风险。一旦你的假设——即对象在函数执行期间不会被销毁——被打破,你就会遇到悬空指针/引用,导致程序崩溃或未定义行为。这种错误往往难以调试,因为它取决于复杂的生命周期交互。
所以,我的建议是:
const std::shared_ptr<T>&
std::sort
shared_ptr
本质上,使用裸指针/引用是一种性能优化或通用性需求,但它要求开发者承担更多的生命周期管理责任。
shared_ptr
多线程环境下的
shared_ptr
一个常见的陷阱是对裸指针或裸引用的不当使用。想象一下,你有一个
shared_ptr<TaskData> data_ptr
data_ptr.get()
data_ptr
TaskData
shared_ptr
另一个陷阱是,即使你正确地传递了
shared_ptr
shared_ptr
shared_ptr
T
TaskData
int counter
data_ptr->increment_counter()
increment_counter
counter
那么,最佳实践是什么呢?
向新线程或异步任务传递shared_ptr
std::shared_ptr<MyData> data = std::make_shared<MyData>();
// ... 对data进行初始化 ...
std::thread t([data_copy = data]() { // data_copy 按值捕获
// 在新线程中使用 data_copy
data_copy->process();
});
t.detach(); // 或 t.join();通过按值捕获(C++11的lambda捕获列表)或者按值传递给函数参数,新线程会获得
shared_ptr
MyData
保护shared_ptr
shared_ptr
std::mutex
std::atomic
class ThreadSafeData {
mutable std::mutex mtx_; // mutable 允许在const方法中加锁
int value_;
public:
void increment() {
std::lock_guard<std::mutex> lock(mtx_);
value_++;
}
int get_value() const {
std::lock_guard<std::mutex> lock(mtx_);
return value_;
}
};
std::shared_ptr<ThreadSafeData> shared_data = std::make_shared<ThreadSafeData>();
// 多个线程可以安全地调用 shared_data->increment() 或 shared_data->get_value()记住,
shared_ptr
谨慎使用std::weak_ptr
weak_ptr
shared_ptr
weak_ptr
shared_ptr
weak_ptr::lock()
shared_ptr
shared_ptr
总之,多线程环境下的
shared_ptr
shared_ptr
以上就是C++shared_ptr与函数参数传递使用方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号