如何将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
相关产品推荐
相关产品推荐

