gpt4 book ai didi

c++ - 共享引用计数的相关智能指针

转载 作者:太空狗 更新时间:2023-10-29 20:28:14 26 4
gpt4 key购买 nike

我有一段C++ Qt接收网络消息并将其解码为由智能指针管理的 Google protobuf 的代码。该函数对 protobuf 进行一些最小的结构解析,以查看是否存在可选消息字段,如果存在某些消息片段,则调度信号。

目前,这些信号包含包含整个消息的智能指针的拷贝,利用引用计数。但是,我想将智能指针分派(dispatch)到消息的特定部分,以便下游处理程序不需要重新解析整个 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);
}
}

这样做,我真的需要一种方法来创建一个“相关的”子指针,它继承(并增加)父指针上的引用计数,以便在所有子指针和父指针之前不会调用数据析构函数超出范围。此功能是否在标准智能指针实现之一中可用,或者我创建了一个不必要的特例?我发现的最接近的是 QtQSharedDataPointer<> ,但我认为这对创建子指针没有帮助。

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;

关于c++ - 共享引用计数的相关智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13824547/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com