我开始学习C ++大约1-2天,我来自Java。 但是在删除对象时我遇到了一个问题。 当我尝试在删除旧对象后创建新对象时出现问题。 我有类“播放器”,它以RGB格式存储其位置,角度,运动和颜色。 这是代码:
class Player {
public:
float posX, posY, motionX, motionY, angle, r, g, b;
Player (float, float);
~Player() {};
void draw() {
< GLCode goes here.. >
}
};
Player::Player(float x, float y) {
posX = x;
posY = y;
cout << "created a player object!\n";
}
int main(int argc, char **argv);
void redraw(void);
void update(void);
//Players List
std::vector<Player*> data;
void keyboard(unsigned char key, int x, int y) {
switch (key) {
case VK_ESCAPE:
if (data.size() > 0) {
Player *p = data[data.size()-1];
delete p;
p = NULL;
data.pop_back();
cout << data.size() << endl;
}
break;
case VK_SPACE:
Player* p = new Player(200, 200);
data.push_back(p);
break;
}
}
void redraw(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
for (UINT i = 0; i < data.size(); i++) {
Player* pr = data[i];
if (pr)
pr->draw();
}
glPopMatrix();
glutSwapBuffers();
}
void update(int v) {
glutTimerFunc(20, update, 0);
glutPostRedisplay();
}
void initGL(int argc, char **argv) {
< GLCode goes here.. >
}
void initGameLogic(void) {
// Here I am creating two player objects, one is red color and one is green
Player* p = new Player(300, 200);
p->r = 0;
p->g = 1;
p->b = 0;
data.push_back(p);
p = new Player(400, 200);
p->r = 1;
p->g = 0;
p->b = 0;
data.push_back(p);
}
void initGameLoop(void) {
< GLCode goes here.. >
}
int main(int argc, char **argv) {
initGL(argc, argv);
initGameLogic();
initGameLoop();
}
所以问题是,当我按下ESC(并删除最后一个玩家)并在此之后按SPACE时,程序会为我创建新的玩家对象,但不知何故(虽然我当然删除了旧的玩家对象)获得了绿色(旧的)播放器的颜色)然而标准颜色是黑色。如果我再次按下它会创建新的播放器,现在使用黑色。 因此,如果我删除所有播放器,然后一个接一个地创建它们 - 前两个是绿色和红色,这意味着程序不会清理对象变量。我可以在类中存储浮点指针,在初始化时为它们分配内存,然后在析构函数中删除它,但是我的析构函数方法应该只是巨大的,因为我需要删除存储在我的对象中的所有变量。 我的代码怎么了?
当我应该重置构造函数中的所有变量时,它是内存泄漏还是可能只是变量初始化问题?
是的,抱歉我的英语不好。
编辑:感谢Ivan Ishchenko,来自莫斯科的Vlad和Mohammad Ali Baydoun。 顺便说一下,正如Mohammad Ali Baydoun为我工作的那样,用玩家对象(不是指针)替换数组的类型。
答案 0 :(得分:3)
您的构造函数不会初始化变量r,g,b。因此,如果使用operator new创建的对象的值已初始化,则变量r,g,b具有任意值。
答案 1 :(得分:2)
您正在为2个第一个玩家设置颜色,而从不为新玩家设置颜色。所以新玩家的颜色变量是未初始化的,可以存储他们想要的任何东西。考虑在Player构造函数中使用BLACK初始化它们。