【发布时间】:2015-11-14 13:36:44
【问题描述】:
这是使用std智能指针确保ptr安全的正确方法吗
这个例子可能不是最好的,但我试图模拟一些真实的代码。我遇到的问题是在实际代码中,通信器指针是一个原始指针,可以随时解除分配 - 导致使用指针时崩溃。
所以我决定研究 std::shared_ptr 和 std::weak_ptr 看看现在我们有 C++11 应该如何设计它。我在发送代码中使用了一个weak_ptr,它检查ptr是否仍然有效,然后才会取消引用ptr。这段代码是正确的方法吗?有什么改进吗?
#include <memory>
#include <iostream>
#include <string>
class communicator
{
public:
communicator(const char* name, int comport, int speed) : name_(name), comport_(comport), speed_(speed) { }
void send(const std::string& s) {
std::cout << "sending " << s << " using " << name_ << " at " << speed_ << " rate and using com port " << comport_ << '\n';
}
private:
const char* name_;
int comport_;
int speed_;
};
class sender
{
public:
sender() {}
void set_communicator(std::weak_ptr<communicator> comms) {
comms_ = comms;
}
void send(const std::string& s)
{
if (auto sh = comms_.lock())
sh->send(s);
else
std::cout << "Attempting to send: " << s << " but ptr no longer exists\n";
}
private:
std::weak_ptr<communicator> comms_;
};
int main() {
sender mysender;
{
// create comms object
std::shared_ptr<communicator> comms(new communicator("myname", 3, 9600));
mysender.set_communicator(comms);
mysender.send("Hi guys!");
} // comms object gets deleted here
mysender.send("Hi guys after ptr delete!");
}
输出:
sending Hi guys! using myname at 9600 rate and using com port 3
Attempting to send: Hi guys after ptr delete! but ptr no longer exists
【问题讨论】:
-
可能更适合codereview。
-
我会使用
std::make_shared。