【问题标题】:how to convert char ** to unique_ptr array?如何将 char ** 转换为 unique_ptr 数组?
【发布时间】:2021-11-16 14:04:03
【问题描述】:

旧代码如下:

    char** wargv = new char*[argc];//memory leak!
    for(int k = 0; k < argc; ++k)
    {
        wargv[k] = new char[strlen(argv[k]) + 1];
        strncpy(wargv[k], argv[k], strlen(argv[k]));
        wargv[k][strlen(argv[k])] = '\0';
    }

因为可能会导致内存泄漏,所以我想将wargv 转换为unique_ptr。怎么做? 我知道如何将char* 转换为unique_ptr,下面的代码有效:

int size_t = 10;
std::unique_ptr<char[]> wargv(new char[size_t]{0});
strncpy(wargv.get(), "abcdef", size_t);

但我不知道如何将char ** 转换为unique_ptr,我尝试了vector,但它不起作用。

【问题讨论】:

  • 改用std::vector&lt;std::string&gt;不是更好吗?
  • 见这里 - stackoverflow.com/questions/31135178/… - using array_ptr_type = std::unique_ptr&lt;char[]&gt;; using array_of_arrays_type = std::unique_ptr&lt;array_ptr_type[]&gt;;
  • 我不想手动释放内存,wargv会传入另一个函数。
  • 您不应使用size_t 作为变量名。它是标准类型名称。此外,我建议考虑@Someprogrammerdude 的建议。
  • 如果要将结果传递给需要char* 参数的函数,则对两个“维度”使用智能指针将无法解决问题。尽可能使用标准 C++ 容器和字符串,然后仅在真正需要时才显式转换为预期值。使用(临时)char** 变量。然后明确地释放一切。

标签: c++11 unique-ptr


【解决方案1】:

正如@Some程序员老兄评论的那样,std::vector&lt;std::string&gt;应该是比std::unique_ptr&lt;&gt;更好的选择,具有内存分配管理。

我试着写一个简单的例子,效果很好。

#include <iostream>
#include <string>
#include <vector>

int main(int argc, char** argv) {
  std::vector<std::string> collection(argc);
  for (auto i = 0; i < argc; i++) {
    collection[i] = argv[i];
  }

  for (const auto& arg : collection) {
    std::cout << arg << "\n";
  }
}

【讨论】:

    猜你喜欢
    • 2016-01-02
    • 2011-06-08
    • 2022-01-22
    • 2013-06-06
    • 2016-03-10
    • 2017-03-05
    • 2021-05-30
    • 2021-10-15
    • 2011-08-13
    相关资源
    最近更新 更多