【问题标题】:Convert char array to C++11 unique_ptr for strcpy将 char 数组转换为 C++11 unique_ptr for strcpy
【发布时间】:2016-01-02 10:52:04
【问题描述】:

目前我在 C++ 中有这段代码(我使用的是 Visual Studio 2013):

char * dest= new char[srcLen + 1] {};
strcpy(dest, source);
std::string s(dest);
delete dest;

如何使用 make_unique 将其转换为 C++11 unique_ptr 以便 strcpy() 可以使用?

我试过了:

auto dest = make_unique<char>(srcLen + 1);
strcpy(dest, source);

但是,strcpy 行出现以下编译错误

Error   1   error C2664: 'char *strcpy(char *,const char *)' : cannot convert argument 1 from 'std::unique_ptr<char,std::default_delete<char>>' to 'char *'

更新我确实使用std::string。我已经更新了我的代码 sn-p 以使其更加清晰。基本上,源 char * 数组可能会或可能不会以 null 结尾。临时的dest 缓冲区确保字符串以空值结尾。我确实想将其转换为std::string。我之前的工作。我只是想知道是否有办法使用make_unique 创建临时缓冲区,这样就不需要newdelete

【问题讨论】:

  • 我有兴趣了解更多关于导致您决定为此使用std::unique_ptr 的思维过程。
  • 我更新了我的帖子来解释我的推理。谢谢。
  • 仍然没有解释你为什么使用new/delete,以及为什么你现在使用std::unique_ptr。哦,好吧。
  • @LightnessRacesinOrbit 我想我想看看使用unique_ptr 创建动态字符数组是否有意义,因为我不必担心删除它,但我想不是。跨度>
  • new/delete 替换为std::unique_ptr 是有意义的,是的,但我怀疑new/delete 首先是否适合您的问题,然后转到std::unique_ptr 只会让你走得更远。为什么不直接从原始数据构造一个std::string 并完成它呢?如果需要,在事后手动剥离可选的空终止符。

标签: c++ c++11 visual-studio-2013 unique-ptr


【解决方案1】:

不要。

使用std::string,该类型设计用于包装动态分配的char 数组。

更一般地,您可以使用T* std::unique_ptr&lt;T&gt;::get() const 成员函数访问std::unique_ptr 的底层指针:

strcpy(dest.get(), source);

另外,你有一个错误,你现在对dest 所做的只是创建一个动态分配的char,初始值为srcLen。哎呀!

一如既往,the documentation 是你的朋友,你绝对应该这样对待它。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,我需要转换一些旧代码以使用std::string,但它与许多其他函数有关联,所以我不能完全重构所有内容。在某个时刻,我一直将字符串作为 char 数组处理。

    我找到的解决方案是创建一个指向 char[] 数组的唯一指针,并将 strpyc_str() 放入其中。显然我不能用它来更新实际的字符串,因为它是只读的,但这不是必需的。

    代码如下:

    std::unique_ptr<char[]> temp_a_local_string(new char[a_local_string.length()+1] {0});
    
    strcpy(temp_a_local_string.get(), a_local_string.c_str());
    
    pa_local_string = temp_a_local_string.get();
    

    从那里开始,pa_localstring(这是原始变量)被视为旧的 char 数组。它很快就超出了范围,因此unique_ptr 死了。

    我可能应该使用make_unique,但我还没有精通自动指针。

    【讨论】:

    • 如果您有新问题,请点击 按钮提出问题。如果有助于提供上下文,请包含指向此问题的链接。 - From Review
    • 这不是问题,我只是提供有用的评论。
    猜你喜欢
    • 2021-11-16
    • 2015-06-12
    • 2016-04-12
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 2014-03-02
    • 2013-06-06
    相关资源
    最近更新 更多