内存泄漏和类属性

时间:2013-02-22 05:35:23

标签: c++

我一直在写一个游戏,我记得在以前的合作社我正在研究一个视频解码器,它会在使用5分钟后崩溃,因为没有留下任何记忆。

我的老板花了一整天的时间来修复它并且第二天回来看我有点生气,因为他告诉我我没有把每个类成员属性都放在构造函数的初始化列表中。

这是一个int或者其他一些数据/原语。现在我认为课堂上的东西是用默认值初始化的,而不是受到地址上任何徘徊的影响。直到现在我才真正考虑过问这个问题,所以我想澄清这一点。

我想说:

#pragma once
#include "GameState.h"
#include "GameGrid.h"

class Shape;

class PlayState : public GameState
{

....

private:
sf::Clock _keyPressClock;

Shape *_droppingShape;
int generateShapeID();
int generateHorizSpawnPos();
};

如果我的所有构造函数初始化都是指针:

PlayState::PlayState() : _droppingShape(NULL) {}

这是不好的做法还是确实会导致内存泄漏?

3 个答案:

答案 0 :(得分:2)

良好的做法?是的,尤其是对于指针,因为NULL / nullptr是我们知道指针不指向对象的唯一方法。

内存泄漏?不,没有分配=>没有泄漏。

答案 1 :(得分:1)

  

现在我觉得课堂上的东西是用默认值初始化的,而不是受到地址徘徊的影响。

嗯,这是部分正确的,因为成员变量是在执行对象的构造函数时构造的。但是,基本类型(如整数,指针等)don't have constructors,所以你不能依赖它们来特别用任何东西(also see this)进行初始化。

通常认为在初始化列表中初始化这些类型是一种很好的做法,但如果在开始使用它们之前将它们初始化到别处,则并不总是必要的。

除非你先分配一些内存,否则你不会得到任何内存泄漏,但如果你delete指针有一些随机值,你肯定会得到一些错误(甚至可能是沉默的),因为它还没有用nullptr初始化。

答案 2 :(得分:0)

IIRC,如果未在初始化列表中显式初始化,则使用“默认构造函数”初始化成员变量。您可以稍后将成员变量的值分配给构造函数体中的值,但效率较低。

对于内存泄漏,只有在使用newnew[]分配内存时才会出现这些问题。只要你不使用这些,那么就没有内存泄漏。但是,如果您使用指针,则此分配将在某处发生,即使它隐藏在auto_ptr内。