C++ std::在带有Qt的getter函数中删除了shared_ptr
我正在为我的Qt项目使用共享指针,但是当我通过共享指针调用C++ std::在带有Qt的getter函数中删除了shared_ptr,c++,qt,shared-ptr,C++,Qt,Shared Ptr,我正在为我的Qt项目使用共享指针,但是当我通过共享指针调用setLayout()时,我得到了一个分段错误 我这样称呼它: model->getBody()->setLayout(layoutTemplate.get()); 函数getBody()返回一个std::shared\u ptr: std::shared_ptr<QWidget> MainTemplate::getBody() { return std::shared_ptr<QWidget>
setLayout()
时,我得到了一个分段错误
我这样称呼它:
model->getBody()->setLayout(layoutTemplate.get());
函数getBody()
返回一个std::shared\u ptr
:
std::shared_ptr<QWidget> MainTemplate::getBody()
{
return std::shared_ptr<QWidget>(ui->body);
}
std::shared_ptr MainTemplate::getBody()
{
返回std::shared_ptr(ui->body);
}
我尝试使用QSharedPointer
而不是std::shared\u ptr
,但结果相同
为什么删除我的指针?
由于共享的\u ptr仅在下次尝试使用ui->body时该语句1结束之前有效,因此它将被删除
您可能不想在getter中创建新的共享所有权。取而代之的是,任何正在获取的内容都应该作为共享的\u ptr存在,并且getter可以返回(共享的\u ptr)的副本
或者,在不转移所有权的情况下,原始指针(body可以为null)或引用(body不能为null)更合适。指针/引用不在指向/引用对象之外的常见警告仍然适用
shared_ptr
特别表示一个对象,该对象由多个实体拥有,并且必须一直存在,直到每个人都使用完为止。每当指向对象的最后一个共享\u ptr
被销毁时,它指向的对象也会被销毁。正确使用共享\u 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
然而,如果出于某种原因,该实体需要能够比其类更长寿(值得怀疑,除非做出了有问题的设计决策),则您需要使该实体本身成为一个共享的\u ptr
,并按值返回它。这将创建共享\u 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{//MainTemplate::UI指向的任何类
私人:
std::共享_ptrbody;
}
}
再说一次,我认为如果您的类是以实用的方式定义的,就不需要这样做。此外,如果ui
ashared\u ptr
不属于某个类,则可以将其返回,而不是返回其主体。然后,让调用方通过返回的共享\u ptr
智能指针访问主体,智能指针表示对象的所有权shared_ptr
特别表示一个对象,该对象由多个实体拥有,并且必须一直存在,直到每个人都使用完为止。每当指向对象的最后一个共享\u ptr
被销毁时,它指向的对象也会被销毁。正确使用共享\u 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
然而,如果出于某种原因,该实体需要能够比其类更长寿(值得怀疑,除非做出了有问题的设计决策),则您需要使该实体本身成为一个共享的\u ptr
,并按值返回它。这将创建共享\u 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{//MainTemplate::UI指向的任何类
私人:
std::共享_ptrbody;
}
}
再说一次,我认为如果您的类是以实用的方式定义的,就不需要这样做。此外,如果
ui
ashared\u ptr
不属于某个类,则可以将其返回,而不是返回其主体。然后,让调用方通过返回的shared_ptr
访问正文,因为shared_ptr
仅在下次您尝试使用ui->body
语句结束之前有效。它将被删除。谢谢,所以我无法返回带有getter的共享_ptr?为什么您需要shared_ptr
呢?我不知道,这是我上司的要求。为什么你要用智能指针和家长的QObject一起使用?您知道父QObject在被销毁时会删除其所有子对象吗?因为共享的\u ptr
只有在下次您尝试使用ui->body
时才有效,它将被删除。谢谢,所以我无法返回带有getter的共享的\u ptr?为什么需要共享的\u ptr
呢?我不知道,这是我上司的要求。为什么你要用智能指针和家长的QObject一起使用?您知道父QObject在销毁时会删除其所有子对象吗?