簡體   English   中英

Qt變量重新分配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM