我正在優化當前的CLI項目。在查看代碼和調試時,我發現我沒有在類中釋放一些動態分配的內存。這裏是我的代碼看起來是:嘗試刪除動態分配的對象會導致運行時崩潰
#include "Laser.h"
Laser::Laser(int x, int y)
{
initCoord = new Coordinate;
initCoord->x = x;
initCoord->y = y;
icon = '~';
}
char Laser::getIcon() const { return icon; }
Coordinate* Laser::getCoord() { return initCoord; }
void Laser::move()
{
++initCoord->x;
}
我已經試過
「Coordinates.h」
#pragma once
#include <Windows.h>
#define LENGTH 40
#define WIDTH 15
struct Coordinate
{
int x = 1;
int y = 1;
};
「Laser.h」
#pragma once
#include "Coordinates.h"
class Laser
{
private:
Coordinate* initCoord;
char icon;
public:
Laser(int x, int y);
char getIcon() const;
Coordinate* getCoord();
void move();
};
「Laser.cpp」添加一個析構函數(當然首先在頭文件中聲明它),清理分配給initCoord
的內存,這看起來像這:
Laser::~Laser()
{
if(initCoord != nullpr) delete initCoord;
}
添加後,它導致運行時錯誤。 「ProgramName.exe已停止工作...」此類的對象存儲在一個簡單的向量中,該向量在程序一次被清除。問題在於碰撞發生在它達到lasers.clear()
線之前。我真的不知道爲什麼這個崩潰發生,並會感謝一些幫助。謝謝! :)
您違反了三/五規則。 – Rakete1111
我很好奇爲什麼你甚至只用2個'int'成員動態地分配'struct'。在這種情況下,將其存儲爲「普通」成員應該更好。 (如果你真的需要一個指針,使用智能指針幾乎總是一個更好的解決方案) – UnholySheep
我不確定,但沒有代碼「++ initCoord-> x」改變你的指針「x」字段? – ElChupacabra