【发布时间】:2023-04-09 14:29:01
【问题描述】:
我正在将一些代码移植到另一个结构中:
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'
有时它会出现在线段错误:
mY[i] += mYSpeed[i];
我无法想象它会是什么,因为代码很旧并且可以正常工作。新的只是基类。
当我在启动应用程序时查看 RAM 使用情况时,我看到几乎 +600 mb!
【问题讨论】:
-
您能否添加一个示例
main函数来展示您如何调用/使用它们?从表面上看,我看不出有什么明显的错误…… -
init函数是代码异味。这就是构造函数的用途。 -
@GMain 我可以从派生类调用基构造函数吗?因为编译器返回了一些关于这个的错误。
-
protected数据成员也是一种代码味道:基类应该如何强制执行其不变量?
标签: c++ exception memory allocation