Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::在带有Qt的getter函数中删除了shared_ptr_C++_Qt_Shared Ptr - Fatal编程技术网

C++ std::在带有Qt的getter函数中删除了shared_ptr

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>

我正在为我的Qt项目使用共享指针,但是当我通过共享指针调用
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)更合适。指针/引用不在指向/引用对象之外的常见警告仍然适用

  • 而且没有复印件
  • 由于共享的\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
    a
    shared\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
    a
    shared\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在销毁时会删除其所有子对象吗?