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)
我的问题是:
为什么我的命令"删除"不起作用?我需要做些什么才能让它们发挥作用?"删除"不会在Visual Studio 2015上突出显示,当代码到达时,Visual Studio会停止我的程序并说"有一个断点".
有没有更好的方法来控制我的程序使用的内存?我使用太多内存,因为每次按"a"或"d"我都会捕获另一张Image的照片,并且我会使用大量内存,因为我没有从内存中删除这些图像.
类Image上有更多的东西,甚至还有一个类(Layer),但对于我的问题,我认为它们不会有所帮助.
你正在创建两个指针
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)
这会泄漏内存sub1并sub2指向它们,因为它们不再指向它,因此无法恢复.然后当你打电话
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[]