无法使删除适用于C++

Can't make Delete to work on C++

本文关键字:适用于 C++ 删除      更新时间:2023-10-16

我试图在c++中销毁对象,但我不能使它工作。关于如何在c++中清除内存,我有几个问题,因为有了GarbageCollector,我在Java中不必这样做。

我的图像类有以下析构函数和属性:

Class Image{
public:
Image(int w, int h){
    width = w; height = h;
    pixels = new int[w*h];
}
    ~Image() {
        delete [] pixels;
}
private:
        int *pixels; 
        int width, height;
}

这就是我对我的图像所做的:

void keyboard(unsigned char key, int x, int y){
        Image* sub1 = new Image(1,1);
        Image* sub2 = new Image(1,1);
    if (key == 'd' && camadas[1].getpXf() < camadas[1].getImage().getWidth() - gameWidth/2) {
        sub1 = &camadas[0].ScrollH(true);
        sub2 = &camadas[1].ScrollH(true);
        sub1->plot(sub2->getPixels(), 0, 0, gameWidth, gameHeight);
        lastScreen = sub1->getPixels();
        glutPostRedisplay();
    }
    if (key == 'a' && camadas[1].getpXi() > 0) {
        sub1 = &camadas[0].ScrollH(false);
        sub2 = &camadas[1].ScrollH(false);
        sub1->plot(sub2->getPixels(), 0, 0, gameWidth, gameHeight);
        lastScreen = sub1->getPixels();
        glutPostRedisplay();
    }
    delete sub1
    delete sub2;
}

我的问题是:

  1. 为什么我的命令"删除"不工作?我要怎么做才能让它们起作用?"delete"在Visual Studio 2015上没有突出显示,当代码到达它时,Visual Studio停止我的程序并说"有一个断点"。

  2. 是否有更好的方法来控制我的程序正在使用的内存?我使用了太多的内存,因为每次我按"a"或"d"时,我都会捕获另一张图像的照片,并且我得到了很多内存使用,因为我没有从内存中删除这些图像。

有更多的东西在类图像,甚至有一个更多的类(图层),但对于我的问题,我不认为他们会有帮助。

您正在创建两个指针

Image* sub1 = new Image(1,1);
Image* sub2 = new Image(1,1);

然后在if语句中重新赋值

sub1 = &camadas[0].ScrollH(true);
sub2 = &camadas[1].ScrollH(true);

这会泄漏sub1sub2所指向的内存,因为它们不再指向它,所以它是不可恢复的。当你调用

delete sub1
delete sub2;

您正在尝试删除

camadas[0].ScrollH(true);
camadas[1].ScrollH(true);

这是未定义的行为。

您也没有显示Images的构造函数。如果pixels没有用new[]声明,那么你的析构函数也是错误的,因为你只在你调用new的东西上调用delete,当你使用new[]时只使用delete[]