簡體   English   中英

發生了什么:C ++ std :: move on std :: shared_ptr會增加use_count嗎?

[英]What is going on: C++ std::move on std::shared_ptr increases use_count?

我總是假設std::shared_ptr上的std::move()竊取指針並將原始指針設置為nullptr -thus而不增加引用計數。 在我的世界里,這似乎並非如此。

設置

MacOS,g ++ -version =>“Apple LLVM版本10.0.1(clang-1001.0.46.3)”

代碼

#include <cstdio>                                                                                                                                                                                  
#include <memory>
class Thing { public: Thing(int N) : value(N) {} int value; };

void print(const char* name, std::shared_ptr<Thing>& sp)
{ printf("%s: { use_count=%i; }\n", name, (int)sp.use_count()); }

int main(int argc, char** argv) {
    std::shared_ptr<Thing>  x(new Thing(4711));
    print("BEFORE x", x);
    std::shared_ptr<Thing>  y = std::move(x);
    y->value = 4712;
    print(" AFTER x", x);
    print(" AFTER y", y);
    return 0;
}

輸出

編譯( g++ tmp.cpp -o test )和運行( ./test ),提供

BEFORE x: { use_count=1; }
 AFTER x: { use_count=2; }
 AFTER y: { use_count=2; }

因此,使用std::move()時引用計數會增加。

問題

這里發生了什么?

這里發生了什么?

在MacOS上,似乎必須使用-std=c++11 (或更高版本的標准)¹明確啟用move-sematics。 否則,該示例恰好編譯(即,相關庫實現中的std::shared_ptr可用)但由於未啟用所需的語言功能,因此無法正常工作。 這導致實際的副本而不是移動構造。 如果未啟用所需的語言功能,AppleClang包甚至不允許實例化std::shared_ptr會更好。

¹)感謝@ t.niese測試給定的編譯器/平台。

暫無
暫無

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

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