我正在努力优化我当前的CLI项目。在查看代码和调试时,我注意到我没有在类中释放一些动态分配的内存。以下是我的代码的外观:
“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”
#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;
}
我已经尝试添加析构函数(当然首先在头文件中声明它),这会清除为initCoord
分配的内存,如下所示:
Laser::~Laser()
{
if(initCoord != nullpr) delete initCoord;
}
添加后会导致运行时错误。 “ProgramName.exe已停止工作......”此类的对象存储在一个简单的向量中,该向量在程序的某个时间被清除。问题是崩溃甚至在它到达lasers.clear()
线之前发生。老实说,我不知道为什么会发生这种崩溃,并希望得到一些帮助。谢谢! :)
答案 0 :(得分:0)
如果您考虑此代码
int main() {
Laser one(0,0);
{
Laser two = one;
cout << two.getCoord()->x << endl;
}
return 0;
}
你期望写什么?
&#34; 0&#34;
这意味着坐标指向与one
相同的结构,这再次意味着当第一个}
发生并且two
被摧毁时one
没有有一个有效的坐标。
当你有一个指针成员时,你需要禁用复制/分配或实现它们。
在这种情况下,如果您使用了std :: unique_ptr而不是原始指针(也可以保存删除),那么您也可以获救。