1

我有这个代码:

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

但是它是否保证当向量改变它的位置时,可能是因为一些内部调整大小和移动对象,不会发生任何不好的事情?

4

2 回答 2

2

vector<T>::push_back当且仅当移动构造T函数不抛出时,才为仅移动类型提供强大的异常安全保证。

在您的情况下T,是 a unique_ptrfor 数组对象,其移动构造函数已声明noexcept(第 20.7.1.3 节),因此您在这里确实很好:如果向量的内部调整大小抛出 a bad_alloc,则向量将保持不变且可用。

于 2013-09-20T07:51:30.877 回答
1

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

于 2013-09-20T07:13:14.900 回答