假设我正在解析map<string, string>
中的环境变量列表,并将其放到unique_ptr<char*[]>
中的2D内存中,但是我不知道如何定制这种2D内存情况下的删除器。
// Given: env (type of map<string, string>)
// Return: unique_ptr<char*[]> (with customized deleter)
// Prepare for parsing the environment to c-style strings
auto idx = size_t{0};
// What should I fill for `ret` a proper deleter that won't give memory leak?
auto ret = std::make_unique<char*[]>(env.size() + 1, ???);
for(const auto& kvp : env) {
auto entry = kvp.first + "=" + kvp.second;
ret[idx] = new char[entry.size() + 1];
strncpy(ret[idx], entry.c_str(), entry.size() + 1);
++idx;
}
ret[idx] = nullptr; // For the later use of exec call
return ret;
显然,由于内部for循环中的new operator
,上面的代码泄漏了。
1条答案
按热度按时间e5nszbig1#
std::make_unique
没有接受deleter作为参数的版本(顺便说一下,std::make_unique
是C14,而不是C11)。您可以将
ret.get()
传递给execvpe。