指针的指针的自动内存管理

auto-memory management for pointers of pointers

本文关键字:指针 管理 内存      更新时间:2023-10-16

有些遗留函数需要动态数组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我重写了我的答案,因为第一个版本似乎已经过时了。