自定义deleter以通过std::unique_ptr解除分配2D阵列
Customize the deleter to deallocate a 2D array through std::unique_ptr
假设我正在将环境变量列表从给定的map<string, string>
解析到由unique_ptr<char*[]>
持有的2D内存。然而,我不确定如何为这个2D内存盒定制deleter?
// 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
,上面的代码会泄漏。
没有任何版本的std::make_unique
接受deleter作为参数(顺便说一句,std::make_unique
是C++14,而不是C++11)。试试这个:
size_t size = env.size() + 1;
auto ret = std::unique_ptr<char*, std::function<void(char**)> >(
new char* [size],
[size](char** ptr)
{
for(size_t i(0); i < size; ++i)
{
delete[] ptr[i];
}
delete[] ptr;
}
);
您可以将ret.get()
传递给execvpe。
相关文章:
- 指针会被解除分配吗?
- 基于浅树的数据结构的内存分配器,用于频繁分配和解除分配
- 解除分配矩形 2D 数组会根据尺寸产生错误
- 为什么在正确解除分配内存时出现内存泄漏?
- 堆栈变量超出范围时是否解除分配?
- 如何在不使用 "new" 关键字的情况下解除分配创建的对象的内存?
- 在 QStandardItemModel 中解除分配项目
- 解除分配此特定 2D 阵列的内存
- C++删除数组只会解除分配第一项
- 在 c++ 中使用向量解除分配
- 与解除分配堆数组相关的语法混淆
- 解除分配与 C++ 中的结构关联的所有内存
- 是否随作用域分配和解除分配堆栈帧
- 如果我使用 std::function 来捕获 lambda,我应该担心它被解除分配吗?
- 如果清除了 std::map 是否确保内存被解除分配
- 在另一个结构中的结构内解除分配指针
- 由 strcpy 设置的解除分配字符 * 时内存泄漏?
- 自定义内存分配和多个继承类的解除分配
- libpq错误消息解除分配
- 程序在解除分配字符数组时崩溃