[英]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 ++玩乐,就应该了解一下:
关于您的编辑:有几个区别,但是我想最重要的是:
绝对好
经验法则是: 将对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.