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
.
的工作方式相同
我想创建一个 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
.