【发布时间】: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<wchar_t> wStr_ptr(new wchar_t[len])应该是std::unique_ptr<wchar_t[]> wStr_ptr(new wchar_t[len])
标签: c++ memory-management smart-pointers