我移植一些代码,以另一种结构:代码需要太多的内存
class EnvironObject
{
protected:
vector<float> mX, mY, mXSpeed, mYSpeed;
int mMaxObjects;
public:
virtual void init(int maxObjects);
virtual void setLimit(int limit);
virtual int getLimit();
virtual void update(float arg) = 0;
};
void EnvironObject::setLimit(int limit)
{
mMaxObjects = limit;
mX.resize(limit, 0); mY.resize(limit, 0);
mXSpeed.resize(limit, 0); mY.resize(limit, 0);
}
int EnvironObject::getLimit()
{
return mMaxObjects;
}
void EnvironObject::init(int maxObjects)
{
mX = mY = mXSpeed = mYSpeed = std::vector<float>(mMaxObjects);
fill(mX.begin(), mX.end(), 0);
fill(mY.begin(), mY.end(), 0);
fill(mXSpeed.begin(), mXSpeed.end(), 0);
fill(mYSpeed.begin(), mYSpeed.end(), 0);
/*mX.reserve(mMaxObjects * 1.5); mY.reserve(mMaxObjects * 1.5);
mXSpeed.reserve(mMaxObjects * 1.5); mYSpeed.reserve(mMaxObjects * 1.5);*/
mMaxObjects = maxObjects;
}
这是一些基本类,现在它的用法:
class Rain : public EnvironObject
{
public:
Rain(int maxDrops = 150);
void update(float windPower);
};
Rain::Rain(int maxDrops)
{
srand(time(NULL));
IEnvironObject::init(maxDrops);
}
void Rain::update(float windPower)
{
for (int i=0; i < mMaxObjects; i++)
{
mX[i] += mXSpeed[i];
mY[i] += mYSpeed[i];
mXSpeed[i] += windPower;
mYSpeed[i] += G;
// Drawing
}
}
默认构造函数的对象Rain
创建(所以,每个数组都是150个元素大小),然后我打电话给setLimit(50)
。 问题是,代码失败几乎每个异常运行:
terminate called after throwing an instance of 'std::bad_alloc'
,有时出现segfaults在行:
mY[i] += mYSpeed[i];
我不能想象什么莫非,因为代码是旧的,有效。新的只是基础类。
当我在启动应用程序时查看内存使用情况时,我看到的差不多是+600 MB!再次
你可以添加一个'main'函数来显示你如何调用这些/使用它们吗?在它的表面上,我看不到任何明显的错误... – 2010-10-20 19:43:42
'init'函数是代码异味。这就是构造函数的用途。 – GManNickG 2010-10-20 20:01:06
@GMain我可以从派生类调用基构造函数吗?导致编译器返回有关此的一些错误。 – Ockonal 2010-10-20 20:07:27