簡體   English   中英

在共享指針的值中調用std :: swap會調用一堆構造函數和析構函數

[英]Calling std::swap in shared pointers' values call a bunch of constructors and destructors

我最近開始學習移動語義和共享指針,並且在理解它方面有很多困難。

我目前正在學習有關這些主題的課程,但是當我們交換指針中包含的值時,講師沒有解釋為什么調用這些構造函數和析構函數。 調用共享指針(如b.swap(a)中的交換)和std :: swap(a,b)不會調用任何構造函數或析構函數,而調用std :: swap(* a,* b)正在召集一堆。

主要代碼:

int main(int argc, char** argv){

    std::shared_ptr<strc> a = std::make_shared<strc>("one");
    std::shared_ptr<strc> b = std::make_shared<strc>("two");

    message("b.swap(a)"); // No constructors or destructors are called.
    b.swap(a);
    disp(a);
    disp(b);

    message("std::swap"); // A bunch of constructors and destructors are called.
    std::swap(*a, *b);
    disp(a);
    disp(b);

    message("std::swap"); // No constructor or destructors are called.
    std::swap(a, b);
    disp(a);
    disp(b);

    return 0;
}

“ strc”的實現類是(為了簡潔起見,我將在其中顯示“重要”實現):

strc::strc(strc && o){
    msg("Move Constructor.");
    this->data = std::move(o.data);
    o.data = nullptr;
}

strc::~strc(){
    msg("Destructor.");
    delete [] data;
}

strc & strc::operator = (strc o){
    msg("Copy and Swap (=).");
    swap(o);
    return *this;
}

void strc::swap(strc & o){
    msg("Calling std::swap");
    std::swap(this->data, o.data);
}

這就是正在打印到控制台的內容(對於我來說,我可以了解更多有關正在發生的事情,並對移動語義和共享指針有透徹的了解)。

呼叫b.swap(a)一(1)兩(1)

調用std :: swap(* a,* b) strc:移動構造方法。 strc:移動構造函數。 strc:復制並交換(=)。 strc:調用std :: swap strc:析構函數。 strc:移動構造函數。 strc:復制並交換(=)。 strc:調用std :: swap strc:析構函數。 strc:析構函數。 兩(1)一(1)

調用std :: swap(a,b)一(1)兩(1)

這是為什么? 它與移動語義有關嗎? 它不應該調用標准交換功能嗎? 我無法理解這些交換調用之間的區別,以及為什么其中之一正在調用所有這些構造函數和析構函數。

  1. b.swap(a)交換指針。
  2. std::swap(*a, *b)交換指向對象的內容。
  3. std::swap(a, b)再次交換指針。

在情況2中使用Move構造函數。這是它們的用途。

在情況1和情況3中也使用了移動構造函數,但是由於沒有修改std::shared_ptr構造函數,因此您沒有觀察到這一點。

您可以在此處了解更多信息復制和替換成語是否應該成為C ++ 11中的復制和移動成語?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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