gpt4 book ai didi

c++ - Qt变量重新赋值

转载 作者:太空宇宙 更新时间:2023-11-04 12:25:50 25 4
gpt4 key购买 nike

我有两个例子有疑问。让我通过一些代码来解释:

问题一:

QStringList qsl(); // Create a list and store something in it
qsl << "foo";
QString test = "this is a test";
qsl = test.split(" ", QString::SkipEmptyParts); // Memory Leak?

当我重新分配 qsl 变量时,“foo”和分配在第一行的原始数据会发生什么?

问题二:

class Foo
{
QStringList mylist;
void MyFunc(QStringList& mylist)
{
this->m_mylist = mylist;

}

void AddString(QString str)
{
mylist << str;
}



}

int main()
{
Foo f;
QStringList *qsl = new QStringList();
f.MyFunc(*qsl);
delete qsl;
f.AddString("this is a test"); // Segfault?
}

在这里,我通过引用一个类来传递一个列表,该类然后存储在所述类中。然后我删除原始对象。

这基本上都归结为将 QObject 分配给 QObject 时发生的情况。我假设创建了一个对象的拷贝,即使该对象是通过引用传入的(当然不是通过指针,那只是一个指针拷贝)。

我还假设 QStringList 之类的东西执行深层复制...这对吗?

最佳答案

分配给 QStringList 变量的工作方式与分配给 C++ 中的任何其他变量的工作方式相同。对于对象,调用左边对象的赋值运算符,将右边对象的内容复制到左边的对象中。通常这只是一个成员分配:

struct A {
int x;
QString y;

A& operator=(const A &other) {
// do the assignment:
x = other.x;
y = other.y;

return *this;
}
};

赋值左侧的对象“ self 调整”以包含与右侧对象相同的内容。没有分配新对象,只是修改了现有对象。

如果类更复杂,例如包含指向动态分配数据的指针(就像 QStringList 的情况一样),赋值运算符的实现可能会更复杂。但这是 QStringList 类的实现细节,您不必为此担心。赋值左侧的 QStringList 对象将被修改为等于右侧的对象。

在问题 2 中,您将一个对象分配给一个成员变量,这会导致修改成员变量中的对象,使其包含与分配给它的对象相同的内容。其他对象稍后被删除与成员变量无关。

语义上这与分配简单整数时相同:

int i, j;
i = j;

存储i 的内存被修改,因此它包含与j 相同的值。 j 之后发生的事情与 i 的值无关。

关于c++ - Qt变量重新赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2585943/

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