Предположим, у вас есть простой класс, подобный этому:
class foo{
private:
int* mData;
int mSize;
public:
foo(int size){
mSize = size;
mData = new int [mSize];
}
~foo() {
mSize = 0;
delete [] mData;
}
};
Тогда внутри main вы делаете:
int main () {
static int HUGE = 100000000;
foo a(HUGE);
// do something useful with a
// .
// .
// .
// Now I'm done with a; I do not need it anymore ...
foo b(HUGE);
// do something useful with b
// Ok we are done with b
return 0;
}
Как видите, a
больше не нужен после b
, но, поскольку он создается в стеке, деструктор не будет вызываться до конца программы. Теперь я знаю, что это не то же самое, что выделение с помощью new
и забывание вызывать delete
, однако это все еще тратит память. Вы считаете это «утечкой памяти» или просто плохим программированием?
Кроме того, как бы вы избежали подобных ситуаций? Одним из способов было бы вручную вызвать деструктор, когда объект больше не нужен, но, помимо того, что он выглядит уродливым и незнакомым, вы столкнетесь с проблемой double free
, если вы не измените деструктор на что-то вроде:
foo::~foo(){
if (mData != NULL){
delete [] mData;
mData = NULL;
mSize = 0;
}
}
Другой способ - создать a
в куче через foo *pa = new foo (HUGE)
, а затем вызвать delete pa
, когда объект больше не нужен. Это работает, но существует опасность появления еще одной возможной утечки памяти (если вы забудете вызвать delete pa
).
Есть ли лучший способ избавиться от ненужных предметов?