2017-10-21 184 views
-2

我正在優化當前的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()線之前。我真的不知道爲什麼這個崩潰發生,並會感謝一些幫助。謝謝! :)

+7

您違反了三/五規則。 – Rakete1111

+1

我很好奇爲什麼你甚至只用2個'int'成員動態地分配'struct'。在這種情況下,將其存儲爲「普通」成員應該更好。 (如果你真的需要一個指針,使用智能指針幾乎總是一個更好的解決方案) – UnholySheep

+0

我不確定,但沒有代碼「++ initCoord-> x」改變你的指針「x」字段? – ElChupacabra

回答

0

如果您認爲此代碼

int main() { 
    Laser one(0,0); 
    { 
     Laser two = one; 
     cout << two.getCoord()->x << endl; 
    } 

    return 0; 
} 

你有什麼期望寫?

「0」

這意味着座標點,以相同的結構one這又意味着,當第一}發生,two被摧毀one沒有一個有效的協調了。

當你有一個指針成員時,你需要禁用複製/分配或實現它們。

在這種情況下,如果您使用了std :: unique_ptr而不是原始指針(這也可以節省您的刪除),那麼您也可以獲救。

+0

感謝或解釋!我切換到shared_ptr,因爲我需要返回它。 – Zablas