sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-12-05 00:04:03 30 4
mua khóa gpt4 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++ 删除就足够了。

1 Câu trả lời

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

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

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

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

//Get the value of m_somethings, creating a (yet unmodified) copy.
QList 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
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com