[英]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)
這是為什么? 它與移動語義有關嗎? 它不應該調用標准交換功能嗎? 我無法理解這些交換調用之間的區別,以及為什么其中之一正在調用所有這些構造函數和析構函數。
b.swap(a)
交換指針。 std::swap(*a, *b)
交換指向對象的內容。 std::swap(a, b)
再次交換指針。 在情況2中使用Move構造函數。這是它們的用途。
在情況1和情況3中也使用了移動構造函數,但是由於沒有修改std::shared_ptr
構造函數,因此您沒有觀察到這一點。
您可以在此處了解更多信息復制和替換成語是否應該成為C ++ 11中的復制和移動成語?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.