weak_ptr 给构造函数引用参数必须是 const, 否则 error: cannot bind non-const lvalue reference of type to an rvalue of type

需求 A类掌握资源,使用 shared_ptr 来指向资源。其他 B,C,D 类使用资源,在构造函数中使用 weak_ptr 作为引用参数来接收资源指针。但是编译是会报错,报错信息: error: cannot bind non-const lvalue reference of type ‘std::weak_ptr<>&’ to an rvalue of type ‘std::weak_ptr<>’ 解决 解决办法很简单,在构造函数的参数 weak_ptr 前面加上 const. std::unique_ptr<CommandProcess> process_; std::shared_ptr<MessageQueue> send_; process_ = make_unique<CommandProcess>(send_); CommandProcess::CommandProcess(const weak_ptr<MessageQueue>& send) : send_(send) { } 参考 c++ 智能指针 传参 GotW #91 Solution: Smart Pointer Parameters C/C++面试:weak_ptr的使用场景 关于c ++:我应该通过引用传递shared_ptr吗? C++ shared_ptr 作为参数和返回值的比较 C++11:再谈shared_ptr,以及shared_ptr参数传递以及构造细节 C++非const引用问题:error: cannot bind non-const lvalue reference of type 【报错】关于{Error} cannot bind non-const lvalue reference of type ‘std::String&‘ to an rvalue……的一个解决方案...

2023-05-10 · 1 min · 81 words · RamLife

使用智能指针替代裸指针

需求 希望使用智能指针,能够尽量减少内存泄漏 解决 智能指针比较适合在局部变量领域,在生命周期结束时,会自动释放。 定义 std::unique_ptr<QSerialPort> port_ = nullptr; std::unique_ptr<int[]> buf_ = nullptr; std::shared_ptr<int> data_ = nullptr; std::weak_ptr<int> weak_ = nullptr; 赋值 port_ = make_unique<QSerialPort>(); // 未初始化 buf_ = make_unique<int[]>(new int[10]); // 初始化为 0 buf_ = make_unique<int[]>(new int[10]()); buf_ = make_unique<int[]>(new int[10]{}); // shared data_ = make_shared<int>(); // weak 必须绑定 shared weak_ = data_; 使用 -> 这个是调用指针指向的对象的相关操作 . 这个是智能指针自身的一些操作 直接使用 shared_ptr 指针有可能会产生循环引用的问题,导致死锁,无法释放。建议使用 weak_ptr 来配合 shared_ptr. 注意 weak_ptr 无法单独存在并使用。 weak_ptr 在使用的时候,需要通过 lock 来获取 shared_ptr 对象,如果相应的内存已经释放,那么会返回 nullptr, 可以通过这个判断内存是否有效。 weak_ptr 本身不会增加 shared_ptr 的引用次数。 释放 释放有好几种方法,最简单的就是第一种。...

2023-03-06 · 1 min · 119 words · RamLife