[英]Qt variable re-assignment
我有兩個問題要問。 讓我通過一些代碼來解釋:
問題1:
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”和第一行分配的原始數據將如何處理?
問題2:
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的文件執行Deepcopy ...這是正確的嗎?
分配給QStringList
變量的工作原理與分配給C ++中的任何其他變量的工作原理相同。 對於對象,將調用左側對象的賦值運算符,以將右側對象的內容復制到左側對象中。 通常,這只是按成員分配:
struct A {
int x;
QString y;
A& operator=(const A &other) {
// do the assignment:
x = other.x;
y = other.y;
return *this;
}
};
分配左側的對象“自適應”到包含與右側對象相同的內容。 沒有分配新對象,僅修改現有對象。
如果類更復雜,例如包含指向動態分配數據的指針(例如QStringList
可能就是這種情況),則賦值運算符的實現可能會更復雜。 但這是QStringList
類的實現細節,您不必擔心。 分配左側的QStringList
對象將被修改為等於右側的對象。
在問題2中,您將一個對象分配給成員變量,這將導致修改成員變量中的對象,使其包含與分配給它的對象相同的內容。 稍后刪除此另一個對象與成員變量無關緊要。
從語義上講,這與分配簡單整數時相同:
int i, j;
i = j;
修改存儲i
的內存,使其包含與j
相同的值。 以后對j
的處理與i
的值無關。
當我重新分配qsl變量時,“ foo”和第一行分配的原始數據將如何處理?
您不能將qsl重新分配給同一范圍內的其他對象。
一旦超出范圍,內存將在其析構函數中回收。
您可以將不同的數據放入qsl中,在這種情況下,它將替換為“ foo”,如有必要,可以分配更多的內存
編輯:例如。 您不能擁有“ QStringlist qsl;” 然后在同一代碼塊中有“ int qsl;”
您可以將qsl中的字符串替換為其他列表,然后容器將為您處理內存
我還假設類似QStringList的文件執行深度復制
是的-節省時間/內存實際上有點復雜,Qt只會在需要時(即更改時)進行復制。 如果將“字符串”復制到許多不同的字符串列表中,則Qt只會保留一個副本並共享給他人,當更改時,Qt會為更改后的副本分配一個新副本-稱為“寫入時復制”,但會自動發生您不需要關心。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.