-1

由於缺少析構函數,我最近有一些錯誤(bad_alloc)。C++析構函數,動態分配

我現在有兩個班,這樣設置:

class ObjOne { 
friend class ObjTwo; 
public:     //constructors and some other random methods 
    ObjOne(int n) { 
    } 

    ObjOne() { 
    } 

private: 
    int currSize; 
    int size; 
    int *jon; 
}; 


class ObjTwo { 
public:      //constructors and some other methods 
    ObjTwo(ObjOne, int n) {} // 
    ObjTwo() {} 
    ObjTwo(const ObjTwo &source) { //copy constructor 
     num = source.num; 
     x = source.x; 
     myObjOne=source.myObjOne; 
    } 
    ~ObjTwo() {       //destructor 
      delete # 
      delete &x; 
      delete &myObjOne; 
     } 


private: 
    ObjOne myObjOne; 
    int num, x; 
}; 

,這裏是我的運營商=爲ObjTwo

ObjTwo& ObjTwo::operator=(const ObjTwo& other) { 
    num = source.num; 
    x = source.x; 
    myObjOne=source.myObjOne; 
    return *this; 
} 

首先,我的假設是(請更正這些如果是不正確):

ObjOne不需要析構函數,因爲它只是基本類型,並且編譯器將使用默認析構函數清理它。 ObjTwo需要析構函數,因爲它包含ObjOne ObjTwo析構函數將需要從x,num和myObjOne中釋放內存。我已經嘗試了使用這個析構函數,但是我仍然遇到bad_alloc錯誤(當測試巨大的循環等)或其他錯誤(當前它只是當析構函數被調用時崩潰)。

什麼我做錯了認識任何指導

編輯: 我有一個bad_alloc異常時,我只是把這個在一個循環中被拋出:

ObjTwo b(//some parameters); 
ObjTwo a(//some parameters); 
for (int i=0; i<20000000; i+) { 
    bool x = (a == b); 
} 

,這是重載==運營商

bool ObjTwo::operator==(const ObjTwo& other) { 

ObjTwo temp = other; 

for(int i=myObjOne.x; i>=0; i--) { 
    if(myObjOne.get(i)!=temp.myObjOne.get(i)) { 
     return false; 
    } 
} 
return true; 
} 

經過對錯誤的一些閱讀後,似乎它是由於內存不足造成的;這是我的無能的析構函數會導致的。這裏可能是什麼問題?

get方法只返回jon [i];

+0

你沒有'new'任何東西,沒有必要'delete'。 –

+1

你的例子都不正確。你似乎有一些誤解。如果你的類分配了一些內存,你需要一個析構函數。 ObjTwo不會這樣做,也不需要析構函數。 ObjOne也沒有提供給我們的代碼。但是ObjOne中的大紅旗是指針。如果ObjOne分配一些內存並使用'jon'指向這個內存,那麼它確實需要一個析構函數。你應該尋找什麼,如果你的類包含指針,那麼他們可能需要一個析構函數。 – john

+0

編輯完成後 - 錯誤可能是因爲您的內存不足。但是你還沒有向我們展示任何分配內存的代碼。到目前爲止,你向我們展示的只是糟糕的析構函數。發佈完整的代碼。 – john

回答

2

您不需要delete的任何用途。你應該只有delete東西,你以前分配new

ObjTwo,成員myObjOnenumx絕對不應該是delete d。事實上,你永遠不應該把它的地址和delete它。當成員對象被銷燬時,成員會自動銷燬。

考慮,例如,具有將其這樣定義的成員:

int* p; 

p是一個指向int。當它所屬的對象被銷燬時,指針本身將被銷燬。然而,假設在構造函數中,動態分配,像這樣的int對象:現在

p = new int(); 

,因爲new動態分配的對象,您將需要delete對象通過p指向。你應該在delete p;的析構函數中做到這一點。請注意,這不會破壞p,它正在銷燬它指出的對象。由於p是會員,因此您不應該手動將其銷燬。

+0

這就是我的想法;然而,爲什麼我會在遇到bad_alloc錯誤時執行反覆的操作,而且沒有'new'或'malloc'。 –

+0

@DaxDurax它可能來自多個地方。您最好嘗試找到'bad_alloc'異常的來源。 –

+0

@DaxDurax例如,將元素插入標準容器可能會導致'bad_alloc'。 –

1

ObjOne可能需要析構函數。這不是關於原始類型,而是關於動態分配的內存(指針)等內容。你有一個int*成員,它可能是動態分配的,或者至少是一個指向動態內存的指針。所以你需要在這一個上使用deletedelete[]
你在做什麼~ObjectTwo是致命的!您試圖從堆棧中刪除內存 - >未定義的行爲,但大多會崩潰。所有的對象/變量都是堆棧分配的,所以你不能刪除它們......

+0

否...''objOne'' *可能*需要一個析構函數,如果'int *'成員是使用'new'分配的,但這不是設置該成員的唯一方法 - 他可以用另一個地址初始化它整數從其他地方。在他的情況下,它根本沒有被分配,所以他不需要析構函數。 –

+0

我糾正了我的帖子,但通常你會有一個指向動態分配內存的指針......從這幾行代碼中不清楚。 –