声明后如何为 unique_ptr 赋值?

Posted

技术标签:

【中文标题】声明后如何为 unique_ptr 赋值?【英文标题】:How to assign value to the unique_ptr after declaring it? 【发布时间】:2018-11-27 06:44:57 【问题描述】:
#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声明后如何赋值?

【问题讨论】:

使用make_unique 那个作业是说明性的,对吧?你真的不会让它保存字符串文字的地址吗? 请展示我忘记的@StoryTeller 示例。 如果你想在你的智能指针中存储一个char*,你就是在声明它是错误的。应该是std::unique_ptr&lt;char&gt; char_ptr; 【参考方案1】:

使用 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;

【讨论】:

【参考方案2】:

您不能天真地将指向字符串文字的指针存储在 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 的数组形式来确保它正确地释放缓冲区并且没有未定义的行为。

【讨论】:

以上是关于声明后如何为 unique_ptr 赋值?的主要内容,如果未能解决你的问题,请参考以下文章

GMS 11.0.0 后如何为 TurnBaseMatches 选择对手?

服务器身份验证后如何为前端提供 JSON Web 令牌?

在Postgres中加入两个表后如何为具有相同名称的列提供别名

在 CentOS 上升级到 python 2.7 后如何为 2.7 版本安装 python-devel

VC6.0程序编译后如何为程序添加图标

django from django_redis import get_redis_connection后如何为该redis添加分布式锁呢?