声明后如何给unique_ptr赋值?
How to assign value to the unique_ptr after declaring it?
#include <iostream>
#include <memory> // unique_ptr
using namespace std;
int main()
{
std::unique_ptr<char*> char_ptr;
char_ptr = (char*)"anisha";
return 0;
}
我想在代码的其他地方为 unique_ptr 赋值。
这会产生以下错误:char_ptr = (char*)"anisha";
error: no match for ‘operator=’ (operand types are ‘std::unique_ptr<char*>’ and ‘char*’)
char_ptr = (char*)"anisha";
声明后如何给unique_ptr
赋值?
使用std::make_unique。
这是对您的代码的编辑 -
#include <iostream>
#include <memory> // unique_ptr
using namespace std;
int main()
{
std::unique_ptr<char*> char_ptr;
//char_ptr = (char*)"anisha";
char_ptr = std::make_unique<char*>((char*)"anisha");
return 0;
}
您不能天真地将指向字符串文字的指针存储在 unique_ptr
中。这里的指针假定它 拥有 引用的对象并且可以释放它。但它不能由指针拥有,因为字符串文字具有静态存储持续时间。
如果你想在 unique_ptr
中存储一个可修改的 c 字符串,你需要分配和复制,你不能用强制转换来破坏类型系统并继续你的快乐生活.
因此,将字符串文字转换为唯一指针的实用程序可能如下所示:
template<std::size_t N>
auto literal_dup(char const (&lit)[N]) {
auto ptr = std::make_unique<char[]>(N);
std::copy(lit, lit + N, &ptr[0]);
return ptr;
}
使用它看起来像这样:
std::unique_ptr<char[]> c_string;
c_string = literal_dup("anisha");
我们需要使用 unique_ptr
的数组形式来确保它正确地释放缓冲区并且没有未定义的行为。
#include <iostream>
#include <memory> // unique_ptr
using namespace std;
int main()
{
std::unique_ptr<char*> char_ptr;
char_ptr = (char*)"anisha";
return 0;
}
我想在代码的其他地方为 unique_ptr 赋值。
这会产生以下错误:char_ptr = (char*)"anisha";
error: no match for ‘operator=’ (operand types are ‘std::unique_ptr<char*>’ and ‘char*’)
char_ptr = (char*)"anisha";
声明后如何给unique_ptr
赋值?
使用std::make_unique。 这是对您的代码的编辑 -
#include <iostream>
#include <memory> // unique_ptr
using namespace std;
int main()
{
std::unique_ptr<char*> char_ptr;
//char_ptr = (char*)"anisha";
char_ptr = std::make_unique<char*>((char*)"anisha");
return 0;
}
您不能天真地将指向字符串文字的指针存储在 unique_ptr
中。这里的指针假定它 拥有 引用的对象并且可以释放它。但它不能由指针拥有,因为字符串文字具有静态存储持续时间。
如果你想在 unique_ptr
中存储一个可修改的 c 字符串,你需要分配和复制,你不能用强制转换来破坏类型系统并继续你的快乐生活.
因此,将字符串文字转换为唯一指针的实用程序可能如下所示:
template<std::size_t N>
auto literal_dup(char const (&lit)[N]) {
auto ptr = std::make_unique<char[]>(N);
std::copy(lit, lit + N, &ptr[0]);
return ptr;
}
使用它看起来像这样:
std::unique_ptr<char[]> c_string;
c_string = literal_dup("anisha");
我们需要使用 unique_ptr
的数组形式来确保它正确地释放缓冲区并且没有未定义的行为。