gpt4 book ai didi

qt - Qt 中的数据结构是在堆上还是在堆栈上?

转载 作者:行者123 更新时间:2023-12-05 00:04:03 30 4
gpt4 key购买 nike

我想知道 Qt 是否将下面代码的“版本 1”之类的东西放在堆上?在版本 1 中,Qt 会将 dirStuff 放在堆栈上还是堆上?我问是因为我有一种感觉,Java 将所有数据结构放在堆上......不确定,因为我不记得曾经用 Java 考虑过这个问题。

版本 1

QFileInfoList dirStuff = dir.entryInfoList(QDir::Dirs | QDir::Files | 
QDir::NoDotAndDotDot | QDir::System | QDir::Hidden);

版本 2
QFileInfoList * dirStuff = new QFileInfoList();
*dirStuff = dir->entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot |
QDir::System | QDir::Hidden);

当然,我会假设第 2 版在堆上,但我想知道是否......
delete dirStuff;

会真正清理 dirStuff 的“版本 2”,因为它不是一个常规对象,而可能是一个链表。我认为清理可能有问题,所以我想知道是否有一种特殊的 Qt 方式我应该清理 Qt 数据结构,如 QFileInfoList在堆上...或者如果常规的旧 C++ 删除就足够了。

最佳答案

QList、QVector 等容器和 QString、QByteArray、QFileInfo 等数据结构可以在堆栈和堆上使用 new/delete 创建。删除总是足够的;任何需要的特殊清理都将封装在析构函数中。

也就是说,如果堆没有充分的理由(通常没有),我上面提到的所有类都应该在堆栈上创建。它们应该通过值/常量引用而不是通过引用或指针传递。它们是隐式共享的(写时复制),这意味着未经修改的副本很便宜。与通过引用传递几乎所有内容的 java 相反,这里的对象是语义值。例子:

 //getter returns copy
QList<Something> Foo::somethings() const {
return m_somethings;
}

//list is passed by const reference to the setter
void Foo::setSomethings( const QList<Something>& l ) {
m_somethings = l;
}
...

//Get the value of m_somethings, creating a (yet unmodified) copy.
QList<Something> list = somethings();
//modify the copy. m_somethings is _not_ modified (different object).
list.append( Something( "Something else" ) );
//Write changes back to m_somethings
setSomethings( list );

另见 this answer到一个类似的问题,解释为什么 QObjects 不同。

关于qt - Qt 中的数据结构是在堆上还是在堆栈上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6039188/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com