2015-05-16 153 views
0
#include <iostream> 

using namespace std; 


class myClass{ 

public: 
    char * pointer; 
    char * pointerToPointer; 

myClass(){ 
    pointer = new char; 
     char x = 'x'; 
     pointer = &x; 

    pointerToPointer = new char[3]; 
     char y[3] = {'x', 'y', 'z'}; 
     pointerToPointer = y; 
} 
~myClass(){ 
    delete pointer; 
    delete[] pointerToPointer; 
}}; 

int main(){ 
myClass myclass; 
return 0; 
} 

我是新來的C++,所以我很抱歉如果這個問題已被打死,但我似乎無法在網上找到答案。釋放會員指針

我想在我的課中加入兩個指針。一個指向單個字母,另一個指向一個字符數組。根據我的理解,每次包含新關鍵字時,都應該在代碼的某個位置附帶delete關鍵字。

我已經包括應該釋放分配給這些指針內存析構函數,但是當它被調用時程序終止的主要功能我留下了我:

錯誤`./a.out」 :munmap_chunk():無效指針:0x00007fffcabc5600 *** 中止(核心轉儲)

任何意見/建議我應該谷歌搜索將不勝感激。

回答

2

下面

pointerToPointer = new char[3]; 
    char y[3] = {'x', 'y', 'z'}; 
    pointerToPointer = y; 

你分配內存以pointerToPointer(第一行),然後使pointerToPointer點到陣列y(第三行)的開頭。當您嘗試刪除pointerToPointer時,您將嘗試刪除指向非動態數組的指針。這會導致段錯誤,因爲y的內存由運行時自動釋放,並且您嘗試在析構函數中再次釋放它。

在任何情況下,切換指針指向某個其他內存位置都要小心,因爲如果忘記取消分配初始分配的內存(在您的情況爲new char[3]),它可能會造成內存泄漏。

+0

非常感謝!堆棧分配再次浪費了我一個小時的時間。有一天,我會徹底解決這個問題。 – Nick