使用unique_ptr和vector

时间:2013-09-20 07:07:13

标签: c++ vector unique-ptr

我有这段代码:

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函数不可用,它会给我编译器错误。

但它能否保证当矢量改变其位置时,可能是因为某些内部重新调整大小并移动物体,会不会发生什么不好的事情?

2 个答案:

答案 0 :(得分:2)

vector<T>::push_back为仅限移动类型if and only if the move construtor of T does not throw提供强大的异常安全保障。

在你的情况下T是数组对象的unique_ptr,其移动构造函数被声明为noexcept(§20.7.1.3),所以你在这里确实很好:如果内部调整大小向量抛出bad_alloc,向量将保持不变并可用。

答案 1 :(得分:1)

我不确定我的问题是否正确,但假设std :: vector没有任何意外行为,是的,它是garantueed。 通过执行std::move(),您可以将对底层指针的控制转移到std::unique_ptr中的std::vector。从这一点开始,它应该表现得像std::vector<char*>