指针的指针的自动内存管理
auto-memory management for pointers of pointers
有些遗留函数需要动态数组a**。例如,
A** array = new A*[100];
foo(array, 100);
...
void foo(A** a, int len) {
for(int i=0;i<len; ++i) {
a[i] = A::create(...);
}
}
我想知道我是否可以使用任何"智能"指针来管理这个数组。
我可以使用boost::scope_array数组。它的array.get()返回A**,因此它可以使用遗留函数。但我认为数组的析构函数只释放顶级指针,而不释放第二级指针。
ptr_vector会自动删除所有内容。但它没有办法返回a**。
我们还有其他解决方案吗?
如果API使用返回指针的A::create(...)
等调用创建对象,那么API肯定有一个互补调用来销毁A::destroy(ptr)
等对象。在这种情况下,以下自定义deleter应该是合适的:
std::unique_ptr<A*, void(*)(A**)> array_ptr(
new A*[100],
[](A** ptr) {
for(std::size_t i = 0; i < 100; i++)
A::destroy(ptr[i]);
delete[] ptr;
}
);
foo(array_ptr.get(), 100);
EDIT我重写了我的答案,因为第一个版本似乎已经过时了。
相关文章:
- 使用"Task"函数指针队列定义作业管理器
- 向量成员在管理类指针C++队列时丢失
- 函数指针和 lambda 的内存管理
- 如何将指针从unique_ptr传递到另一个对象并管理寿命
- 哪些资源是由智能指针管理的,而它们的内存不是由new分配的
- 底层指针和内存管理
- 坚持将双指针管理的内存复制到二维数组
- 智能指针,避免使用QNetworkAccessManager时进行手动内存管理
- 循环和内存管理中的指针算术C++?
- 可以通过非原始指针来增强容器矢量管理内存
- 管理到本机值类转换:强制转换指针是否安全?
- 指针的一系列指针:管理不同语言的字符串
- C 11 / 14-是否有针对其他地方管理的资源的原始指针包装器
- 编写安全包装类以管理用户定义对象的指针
- C++ |方法范围指针管理
- 如何在将指针传递给库函数时处理内存管理
- C++管理单一实例中的堆/指针
- 学生成绩管理系统 在C++中,表达式必须具有指向对象类型的指针
- 使用智能指针管理函数内分配的内存
- 原始指针管理