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

标签 c++ qt

我是 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 只能检查构造函数调用中的列表,如果它想保留一些信息,则必须制作自己的拷贝。

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

关于c++ - 将对象传递给参数时了解堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28693520/

相关文章:

c++ - boost程序选项的parse_config_file如何解析multitoken

c++ - 如何设计:矩阵的线性代数例程

c++ - 自动提交被禁用并且永远不会回滚会发生什么?

qt - QTableWidget 标题的上标

c++ - Qt单元测试依赖问题

qt - 单个项目中有多个窗口

c++ - std vector 迭代器不支持地址运算?

c++ - 如何在 C++ 中对变量使用科学记数法?

c++ - 检测键盘/条形码扫描仪事件的来源

c++ - SpinBoxDelegate 和 QItemDelegate