【问题标题】:Using unique_ptr and vector使用 unique_ptr 和向量
【发布时间】:2013-09-20 07:07:13
【问题描述】:

我有这个代码:

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

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

【问题讨论】:

  • 我是唯一一个注意到最后一行&amp;(argv[0]._Myptr) 的人吗?通过这种机制访问那个指针已经够糟糕的了,我什至不想猜测你为什么要把它的地址传递给……什么东西。您将很难找到较少便携或标准的东西。
  • @WhozCraig 我实际上想要char ** 在那个位置。你能推荐一个更好的方法吗?
  • 是的。 char *tmp = data.get();,并使用&amp;tmp 我假设这是一个strtol-type 函数,如果是这样,它会在结果指针指向指针中返回终止信息(即它修改了指针)行为超出了未定义.即使 访问 该成员也是特定于实现的,无论如何都要使用临时 ptr。你现在用&amp;(argv[0]._Myptr) 做的事情是可怕的

标签: c++ vector unique-ptr


【解决方案1】:

vector&lt;T&gt;::push_back 为仅移动类型if and only if the move construtor of T does not throw 提供了强大的异常安全保证。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 是否还会保留 unique_ptr 的属性,如超出范围后删除?
    • 是(从某种意义上说,当vector argv 超出范围时,您分配的数据将被删除 - 从某种意义上说,当其unique_ptr 从向量)。
    • 当然,执行std::move()会将底层对象的控制权转移到std::vector&lt;std::unique_ptr&lt;char*&gt;&gt;中的std::unique_ptr&lt;char*&gt;,意思就是,就像旧的std::unique_ptr&lt;char*&gt;从来没有存在。
    猜你喜欢
    • 2013-01-10
    • 2014-07-21
    • 1970-01-01
    • 2021-05-16
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多