繁体   English   中英

删除指针数组-我做对了吗?

[英]Deleting an Array of Pointers - Am I doing it right?

对于提出有关删除指针的问题,我感到有点愚蠢,但是我需要确保以正确的方式删除指针,因为我目前正在执行程序的调试过程。

基本上,我在头文件中定义了一些指针数组,如下所示:

AsteroidView *_asteroidView[16];

然后在for循环中初始化它们:

for(int i = 0; i < 16; i++)  
{  
      _asteroidView[i] = new AsteroidView();  
} 

好的,到目前为止,一切正常。 当我最终需要在析构函数中删除它们时,请使用以下代码:

for(int i = 0; i < 16; i++)  
{  
        delete _asteroidView[i];  
}

这就是我需要做的吗? 我感觉是这样,但是我担心内存泄漏。

出于兴趣...与对象数组相比,指向对象的数组之间有很大区别吗?

这是对的。 但是,您可能要考虑使用Boost.PointerContainer ,从而省去了手动资源管理的麻烦:

boost::ptr_vector<AsteroidView> _asteroidView;
for(int i = 0; i < 16; i++)
{
    _asteroidView.push_back(new AsteroidView());
}

您不必管理删除操作,容器会为您完成删除操作。 这项技术称为RAII ,如果您想使用C ++玩乐,就应该了解一下:

关于您的编辑:有几个区别,但是我想最重要的是:

  1. 指针数组可以包含不同类型的对象(如果它们是数组类型的子类)。
  2. 对象数组不需要任何删除,销毁数组时将销毁所有对象。

绝对好

经验法则是: 将对new每个调用与相应的delete调用匹配(并将对new[]每个调用与delete[]的调用匹配)

这就是我需要做的吗? 我感觉是这样,但是我担心内存泄漏。

是。 该程序正在正确分配资源。 没有内存泄漏:)


如果您对使用std::vector感到满意(实际上很容易),那么当它超出范围时,它将执行重新分配过程。 但是,类型应为-

std::vector<AsteroidView>

给定一堂课:

// this class has hidden data and no methods other than the constructor/destructor
// obviously it's not ready for prime time
class Foo {
    int* bar_[16];

    public:
    Foo()
    {
        for (unsigned int i = 0; i < 16; ++i)
            bar_[i] = new int;
    }

    ~Foo()
    {
        for (unsigned int i= 0; i < 16; ++i)
            delete bar_[i];
    }
};

如果构造器正确完成,您不会泄漏内存。 但是,如果new失败在构造函数中失败(如果您的内存不足, new会抛出std::bad_alloc ), 则析构函数不会运行 ,并且发生内存泄漏。 如果这让您感到困扰,则必须使构造函数异常安全(例如,在构造函数周围添加try ... catch块,使用RAII)。 就个人而言,如果数组中的元素必须是指针,则我将仅使用Boost Pointer Container,否则将使用std::vector

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM