gpt4 book ai didi

c++ - std::shared_ptr 在 Qt 的 getter 函数中被删除

转载 作者:行者123 更新时间:2023-11-30 01:39:35 29 4
gpt4 key购买 nike

我正在为我的 Qt 项目使用共享指针,但是当我通过共享指针调用 setLayout() 时,我遇到了段错误。

我是这样调用它的:

 model->getBody()->setLayout(layoutTemplate.get());

函数 getBody() 返回一个 std::shared_ptr:

std::shared_ptr<QWidget> MainTemplate::getBody()
{
return std::shared_ptr<QWidget>(ui->body);
}

我尝试使用 QSharedPointer 而不是 std::shared_ptr,但结果相同。

为什么我的指针被删除了?

最佳答案

智能指针表示对象的所有权shared_ptr特别是代表一个由多个实体拥有并且必须存在直到每个人都用完它的对象。每当最后shared_ptr指向一个对象被销毁,它指向的对象也被销毁。 shared_ptr的正确使用是:

std::shared_ptr<T> ptr_a(new T); // Create a T and immediately pass it to shared_ptr
std::shared_ptr<T> ptr_b = std::make_shared<T>(); // Same effect but more efficient

ptr_a = ptr_b; // smart pointer to smart pointer assignment (never existing raw to smart)
ptr_a.reset(new T); // This is fine.
ptr_a = std::make_shared<T>(); // Same as previous line. Again more efficient

//... eventually ptr_a and ptr_b go out of scope and handle deleting their objects

请注意,在所有重新分配的示例中,ptr_a检查引用计数并删除持有的对象,如果它是最后一个 shared_ptr指向它。

通常,您只想在创建智能指针的确切时刻将原始指针传递给智能指针。您所做的是将对象的所有权 传递给临时智能指针。声明后,临时shared_ptr被销毁并且因为从未制作过它的拷贝,它认为它应该销毁 ui->body .通常你想要做的只是返回 body通过非常量引用,或者只是不返回它并为其参数提供设置函数。

QWidget& MainTemplate::getBody()
{
return ui->body;
}

但是,如果某些原因决定 body 需要能够比它的类长寿(值得怀疑,除非做出有问题的设计决策),您需要将 body 本身设为 shared_ptr并按值(value)返回。这将创建 shared_ptr 的拷贝并且你保证他们中的最后一个将破坏该对象。但是你绝不能在主体构造后使用原始指针,也不能手动尝试删除它。

UI {    // whatever class MainTemplate::ui points to
private:
std::shared_ptr<<QWidget> body;
...
}

MainTemplate {
public:
std::shared_ptr<QWidget> MainTemplate::getBody()
{
return ui->body;
}
}

同样,如果您的类是以实用的方式定义的,我认为不需要这样做。另外,你可以制作 ui一个shared_ptr如果它不属于某个类,则返回它而不是它的主体。然后,让调用者通过返回的 shared_ptr<UI> 访问主体.

关于c++ - std::shared_ptr 在 Qt 的 getter 函数中被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45369848/

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