无法使Delete工作在C++上

Raf*_*pat -2 c++ destructor delete-operator

我试图用C++破坏对象,但我不能让它工作.我有几个关于如何在C++中清除内存的问题,由于GarbageCollector,我在Java中没有这么做.

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

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;

}
Run Code Online (Sandbox Code Playgroud)

这是我正在用我的图像做的事情:

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;

}
Run Code Online (Sandbox Code Playgroud)

我的问题是:

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

  2. 有没有更好的方法来控制我的程序使用的内存?我使用太多内存,因为每次按"a"或"d"我都会捕获另一张Image的照片,并且我会使用大量内存,因为我没有从内存中删除这些图像.

类Image上有更多的东西,甚至还有一个类(Layer),但对于我的问题,我认为它们不会有所帮助.

Nat*_*ica 6

你正在创建两个指针

Image* sub1 = new Image(1,1);
Image* sub2 = new Image(1,1);
Run Code Online (Sandbox Code Playgroud)

然后你在if语句中重新分配它们

sub1 = &camadas[0].ScrollH(true);
sub2 = &camadas[1].ScrollH(true);
Run Code Online (Sandbox Code Playgroud)

这会泄漏内存sub1sub2指向它们,因为它们不再指向它,因此无法恢复.然后当你打电话

delete sub1
delete sub2;
Run Code Online (Sandbox Code Playgroud)

你想删除

camadas[0].ScrollH(true);
camadas[1].ScrollH(true);
Run Code Online (Sandbox Code Playgroud)

哪个是未定义的行为.

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