我是 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);
// ...
}
最佳答案
是的,list
在MainWindow
构造函数返回之前一直有效。 QStringListModel
没有收到列表的拷贝也是正确的。
QStringListModel
只能检查构造函数调用中的列表,如果它想保留一些信息,则必须制作自己的拷贝。
编译器不保证也不强制执行此操作,但这是常见的做法。存储引用或完全拥有对象所有权的函数应始终记录为执行此操作,正是因为您刚刚找到的原因。
关于c++ - 将对象传递给参数时了解堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28693520/