0

我一直在写一个游戏,我记得在以前的合作中,我正在开发一个视频解码器,它会在使用 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) {}

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

4

3 回答 3

2

好习惯?是的,特别是。对于指针,因为NULL/nullptr是我们知道指针不指向对象的唯一方法。

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

于 2013-02-22T05:36:34.687 回答
1

现在我认为一个类中的东西是用默认值初始化的,而不是受到地址上任何东西的影响。

嗯,这是部分正确的,因为成员变量是在执行对象的构造函数时构造的。但是,基本类型(如整数、指针等)没有构造函数,因此您不能依赖它们来使用任何特定的东西进行初始化(另请参阅this)。

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

除非您先分配一些内存,否则您不会发生内存泄漏,但如果您delete的指针具有一些随机值,您肯定会遇到一些错误(甚至可能是无声的),因为它没有用nullptr.

于 2013-02-22T05:48:39.647 回答
0

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

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

于 2013-02-22T05:41:24.927 回答