[英]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::vector
的std::unique_ptr
。 從這一點來看,它的行為應類似於std::vector<char*>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.