簡體   English   中英

使用unique_ptr和vector

[英]Using unique_ptr and vector

我有以下代碼:

v8::Handle<v8::Value> StartMethod(const v8::Arguments &args) {
    v8::HandleScope scope; // node_isolate
    int length = args.Length();
    std::vector<std::unique_ptr<char[]>> argv;
    for(int i=0;i<length;++i) {
        if(args[i]->IsString()) {
            v8::String::Utf8Value str(args[i]);
            const int strLen = ToCStringLen(str);
            if(strLen) {
                std::unique_ptr<char []> data(new char[strLen+1]);
                strcpy_s(data.get(), strLen+1, ToCString(str));
                argv.push_back(std::move(data));
            }
        }
    }
    return scope.Close(v8::Int32::New(MainMethod(argv.size(), &(argv[0]._Myptr))));
}

我正在使用std::move ,並且工作正常。 當我不使用std :: move時,由於assignment函數不可用,它給了我編譯器錯誤。

但是,它是否可以保證當向量改變其位置時,可能是由於某些內部調整大小並移動對象而不會發生任何不良情況?

當且僅當T的移動構造函數未拋出時, vector<T>::push_back為僅移動類型提供強大的異常安全保證。

在您的情況下, T是數組對象的unique_ptr ,其移動構造函數聲明為noexcept (第2.0.7.1.3節),因此,您的確不錯:如果向量的內部調整大小拋出bad_alloc ,則向量將保持不變且可用。

我不確定我是否正確回答了您的問題,但是在std :: vector沒有任何意外行為的假設下,是的,它是可靠的。 通過執行std::move()您可以將對底層指針的控制權轉移到std::vectorstd::unique_ptr 從這一點來看,它的行為應類似於std::vector<char*>

暫無
暫無

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

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