尝试删除动态分配的对象会导致运行时崩溃

时间:2017-10-21 19:05:20

标签: c++ oop memory optimization runtime-error

我正在努力优化我当前的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()线之前发生。老实说,我不知道为什么会发生这种崩溃,并希望得到一些帮助。谢谢! :)

1 个答案:

答案 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而不是原始指针(也可以保存删除),那么您也可以获救。