c++ - 内存处理问题

标签 c++ oop

我大约1-2天开始学习C++,我是从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 为我工作的建议,将数组的类型替换为播放器对象(而不是指针)。

最佳答案

您的构造函数不会初始化变量 r、g、b。因此,如果使用 operator new 创建的对象是值初始化的,则变量 r、g、b 具有任意值。

关于c++ - 内存处理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19458459/

相关文章:

c++ - shared_ptr<T> 如何访问 T 的元素或函数

c++ - 无法导出 C++ Builder 64 位 DLL 中的函数

c++ - 为什么删除移动构造函数后我的对象没有被复制?

c - 在 C 中执行 OOP 时模拟 'this' 指针的优雅方法?

c++ - 如何在 C++ 中成对显示正则表达式输出?

c++ - winapi - 日期时间选择器,更改上一个/下一个按钮的大小

javascript - 原型(prototype)编程中的对象和原型(prototype)有什么区别?

java - 什么时候停止读取 telnet 输入?

php - 为什么将变量传递给类而不是方法

javascript - JavaScript 中的继承 : Calling parent's method