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の move コンストラクターがをスローしない場合にのみT、 move-only 型に強力な例外安全保証を与えます。

あなたの場合Tは、unique_ptr移動コンストラクターが宣言されている配列オブジェクトの ですnoexcept(§20.7.1.3)。したがって、ここでは問題ありbad_allocません。

于 2013-09-20T07:51:30.877 に答える
1

あなたの質問が正しかったかどうかはわかりませんが、 std::vector に予期しない動作がないという仮定の下では、はい、保証されています。実行することによりstd::move()、下にあるポインターの制御を の に移しstd::unique_ptrますstd::vector。この時点から、次のように動作する必要がありますstd::vector<char*>

于 2013-09-20T07:13:14.900 に答える