如何正确释放一组指针?

Mae*_*tro 1 c++ dynamic-memory-allocation stdset

如果我有一个容器,比如std::set指向动态对象的指针,那么我如何释放它的元素?

int main()
{

    // new scope
    {
        int x = 10;
        std::set<int*> spi;
        spi.insert(new int(1));// elem is a dynamic object init from 1
        spi.insert(new int[3]()); // elem is a dynamic array of 3 default-init integers
        spi.insert(&x); // elem is address of stack memory object
    }
}
Run Code Online (Sandbox Code Playgroud)

那么如何有效地释放具有动态内存的元素呢?

  • 我知道我可以使用一组 shared_ptrs 或 unique_ptr 但为了练习,我想知道如何使用。

R S*_*ahu 7

您必须遍历容器的内容并释放与每个元素对应的内存。

for ( auto ptr : spi )
{
   delete [] ptr;
}
Run Code Online (Sandbox Code Playgroud)

但是,请记住,您发布的代码是有问题的。您不能delete获得通过使用addressof运算符获得的指针。如果您尝试调用delete容器的所有元素,以下行将导致下游出现问题。

spi.insert(&x);
Run Code Online (Sandbox Code Playgroud)

避免将此类混合指针放入容器中。您无法知道new使用addressof运算符分配了哪个元素以及使用运算符获取了哪个元素。

不仅如此,如果添加所获得的指针new int(10),并new int[3]在容器中,你会遇到不确定的行为无论你用deletedelete []在容器的elments。其中之一将是错误的。

我的建议是尝试编写干净的代码,而不是尝试寻找创造性的方法来处理写得不好的代码。

  • @HolyBlackCat,真是一团糟:) :) (2认同)