【问题标题】:Return unique_ptr by value or by reference? [duplicate]按值或按引用返回 unique_ptr? [复制]
【发布时间】:2021-11-13 05:04:25
【问题描述】:

我想创建一个长度是动态的 wchar_t*。所以我决定写如下函数:

std::unique_ptr<wchar_t> mem::TO_WCHAR_T_PTR(char* str)
{
    size_t len = strlen(str) + 1; // Size of my wchar_t string
    std::unique_ptr<wchar_t> wStr_ptr(new wchar_t[len]); // Compiler supports C++17

    size_t convertedChars = 0;

    mbstowcs_s(&convertedChars, wStr_ptr.get(), len, str, _TRUNCATE);

    return wStr_ptr; // Is this save to use?
}

int main(int argc, char** argv)
{
    char str[] = "Hello world";
    auto ptr1 = TO_WCHAR_T_PTR(str);

     // Do some stuff ...

    return 0;
} // ptr1 out of scope so it gets deleted or was it already deleted(?)

我的问题:可以按值使用智能指针还是需要通过引用传递它们?我知道使用 unique_ptr 时的 move 我只是想确保我可以像这样使用 smart_ptr。 下一个问题:它也适用于 shared_ptr 吗?

【问题讨论】:

  • 返回对局部变量的引用是UB,所以返回它的唯一方法是按值。
  • "我想创建一个长度是动态的wchar_t*" - 已经有一个解决方案,它是一个std::wstring
  • 我希望unique_ptr 使用delete,而它应该使用delete[]。为什么不使用标准容器之一而不是尝试封装原始数组?作为介绍,请确保您在 codereview.stackexchange.com 上提交您的代码以供审核!
  • 来自 cppreference 关于 std::unique_ptr 的移动构造函数(复制 c'tor 已删除,因此您的函数不能将其用作返回值): 构造一个 unique_ptr 通过将所有权从 u 转移到 *this 并将空指针存储在 u 中。
  • std::unique_ptr&lt;wchar_t&gt; wStr_ptr(new wchar_t[len]) 应该是std::unique_ptr&lt;wchar_t[]&gt; wStr_ptr(new wchar_t[len])

标签: c++ memory-management smart-pointers


【解决方案1】:

您返回std::unique_ptr 的方式是正确的。它将通过 NRVO (命名返回值优化) 直接放置在 ptr1 中或移入其中。但是,您应该 return std::move(wStr_ptr),因为这会阻止 (N)RVO。 std::shared_ptr 的工作方式相同。

【讨论】:

    【解决方案2】:

    我想创建一个长度是动态的wchar_t*

    所以使用std::wstring。或者如果它不是一个实际的字符串,也许是一个std::vector&lt;wchar_t&gt;

    unique_ptr 对您没有任何帮助。为什么要放弃关于分配大小的信息?


    另外,@tkausl 是正确的,因为您不能返回对局部变量的引用,这是未定义的行为; @TedLyngmo 正确指出您使用了错误类型的 unique_ptr,因为您分配的是一系列元素,而不仅仅是一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      • 2015-10-03
      • 2018-07-29
      • 2014-05-14
      • 2014-11-11
      • 2011-11-10
      相关资源
      最近更新 更多