em.*_*kay 3 c++ smart-pointers
我有一段C++ Qt代码,它接收网络消息并将其解码为由智能指针管理的Google protobuf.该函数对protobuf进行一些最小的结构解析,以查看是否存在可选的消息字段,如果存在某些消息,则调度信号.
目前,这些信号包含包含整个消息的智能指针的副本,利用引用计数.但是,我想将智能指针发送到消息的特定部分,以便下游处理程序不需要重新解析整个protobuf.我不能简单地创建一个指向相关消息部分的新智能指针,因为当新指针超出范围时,它将尝试释放该部分.
尝试说明这一点,省略一些安全检查:
void Interface::processProtobuf(QByteArray const & networkData) {
QSharedPointer<proto_message> msg(new proto_message);
msg->ParseFromArray(networkData.data(), networkData.length());
if (msg->has_configuration()) {
// This will eventually attempt to free, thus causing corruption
// of msg.
QSharedPointer<config_message> cfg(msg->mutable_configuration());
emit configurationChanged(cfg);
// I resorted to this, which forces the receiver to re-parse
// the data structure (which might be expensive for a deeply-nested
// message) to get the desired 'configuration' pointer.
emit configurationChanged(msg);
}
}
Run Code Online (Sandbox Code Playgroud)
这样做,我真的需要一种方法来创建一个"相关的"子指针,它继承(并递增)父指针上的引用计数,这样就不会调用数据析构函数,直到所有的子节点和父节点都不在范围.这个功能是在标准智能指针实现之一中可用的,还是我创建了一个不必要的特殊情况?我发现的最接近的是Qt's QSharedDataPointer<>,但我不认为在创建子指针的情况下它会有所帮助.
Qt解决方案不是必需的.这更像是一个学术问题,因为我的解决方案对于我目前的案例会很好.
std::shared_ptr(或者,boost::shared_ptr如果你没有C++ 11)有一个构造函数,它接受一个共享指针r和一个指针p.所构建的共享指针将指向*p,但共享所有权与r.这应该是你需要的.
构造函数的签名是
template<class Y> shared_ptr(const shared_ptr<Y>& r, T *p) noexcept;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
317 次 |
| 最近记录: |