Return unique_ptr 按值还是按引用?

Return unique_ptr by value or by reference?

我想创建一个 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 吗?

I want to create a wchar_t* which length is dynamic.

所以使用 std::wstring. Or if it's not an actual string, perhaps an std::vector<wchar_t>.

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


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

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

的工作方式相同