将对象传递给参数时了解堆栈

Understanding stack when passing object to param

本文关键字:了解 堆栈 参数 对象      更新时间:2023-10-16

我是C++的新手,正在尝试理解一些堆栈问题。

在下面的代码中,list是在堆栈中创建的,对吗?因此,每个字符串项都存储在堆栈位置(其地址)。现在,当我在QStringListModel(const QStringList &strings, ...)的引用参数中传递list时,列表不会被复制,而是只传递了一个引用(addr),对吗?所以它仍然在方法的相同堆栈范围内?如果列表真的存在于堆栈中,那么当它的作用域结束时,它是如何不被销毁的?如果它仍然存在,那么一旦我在模型内向列表中添加新项目,堆栈会增长/收缩吗?

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    // ...
    QStringList list;
    list << "aaa" << "bbb" << "ccc";
    QStringListModel *model = new QStringListModel(list, this);
    // ...
}

是的,listMainWindow构造函数返回之前一直有效。QStringListModel没有接收到该列表的副本也是正确的。

QStringListModel只能在构造函数调用中检查列表,如果它想保留一些信息,就必须制作自己的副本。

编译器不保证也不强制执行这一点,但这是常见的做法。存储引用或完全拥有对象所有权的函数应该始终记录下来,这正是因为您刚刚找到的原因。