You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将char **类型转换为unique_ptr数组以避免动态内存泄漏?

C++ char** 转智能指针实现方案

方案1:嵌套unique_ptr原生实现

对于二维字符数组的场景,可以使用嵌套的unique_ptr完成内存自动管理,外层智能指针管理指针数组的内存,内层智能指针管理单条字符串的内存,实现代码如下:

#include <memory>
#include <cstring>

// 入参为原有argc、argv
std::unique_ptr<std::unique_ptr<char[]>[]> wargv = std::make_unique<std::unique_ptr<char[]>[]>(argc);
for (int k = 0; k < argc; ++k) {
    size_t str_len = strlen(argv[k]);
    wargv[k] = std::make_unique<char[]>(str_len + 1);
    strncpy(wargv[k].get(), argv[k], str_len);
    wargv[k][str_len] = '\0';
}

如果需要获取原生char**类型传递给C接口,可以临时构建原生指针数组:

auto tmp_argv = std::make_unique<char*[]>(argc);
for (int k = 0; k < argc; ++k) {
    tmp_argv[k] = wargv[k].get();
}
// 示例调用C接口:execvp(tmp_argv[0], tmp_argv.get());

该方案完全不需要手动释放内存,离开作用域后会自动逐层回收所有分配的内存,彻底避免内存泄漏。

方案2:vector实现(更易维护)

如果不需要严格对齐原有char**的使用逻辑,更推荐用vector结合string的实现,代码可读性和可维护性更高,同样不存在内存泄漏风险:

#include <vector>
#include <string>
#include <cstring>

std::vector<std::string> wargv_vec;
wargv_vec.reserve(argc);
for (int k = 0; k < argc; ++k) {
    wargv_vec.emplace_back(argv[k]);
}

// 需传递char**给C接口时,临时构建指针数组
std::vector<char*> tmp_argv;
tmp_argv.reserve(wargv_vec.size() + 1);
for (auto& str : wargv_vec) {
    tmp_argv.push_back(str.data());
}
tmp_argv.push_back(nullptr); // 适配要求argv以nullptr结尾的C接口
// 调用接口时传入tmp_argv.data()即可

你之前使用vector没有成功,大概率是没有处理好string转原生C字符串的逻辑,按上述方案实现即可兼容绝大多数场景。

内容的提问来源于stack exchange,提问作者hupantingxue

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:15:02