2013-10-09 30 views
0
# include "stdafx.h" 
    # include <iostream> 
    #include <ctype.h> 
    using namespace std; 
    class a 
    { 
    protected: 
     int d; 
    public: 
     virtual void assign(int A) = 0; 
     int get(); 
    }; 

    class b : a 
    { 
     char* n; 
    public: 
     b() 
     { 
     n=NULL; 
     } 
     virtual ~b() 
     { 
     delete n; 
     } 
     void assign(int A) 
     { 
      d=A; 
     } 
     void assignchar(char *c) 
     { 
      n=c; 
     } 
     int get() 
     { 
      return d; 
     } 
     char* getchart() 
     { 
       return n; 
     } 
    }; 

    class c : b 
    { 
     b *pB; 
     int e; 
    public: 
     c() 
     { 
       pB=new b(); 
     } 
     ~c() 
     { 
       delete pB; 
     } 
     void assign(int A) 
     { 
       e=A; 
       pB->assign(A); 
      } 
     int get() 
     { 
      return e; 
     } 
     b* getp() 
     { 
      return pB; 
     } 
    }; 

    int _tmain(int argc, _TCHAR* argv[]) 
    { 
        c *pC=new c(); 
        pC->assign(10); 
        b *p=pC->getp(); 
        p->assignchar("a"); 
       char *abc=p->getchart(); 
       delete pC; 
        cout<<*abc<<endl; 
       getchar(); 
    } 

我是C++的noob,正在嘗試何時達到這一點。我不明白爲什麼我不斷收到來自VS2010的內存損壞消息。我試圖通過將其分解成更小的位來複制更高級別的問題,任何幫助將不勝感激。執行我的代碼時出現內存損壞

回答

0

匆匆一瞥,您將一個靜態字符數組傳遞給AssignChar,它不能被刪除(即,當您在代碼中鍵入「A」時,編譯器會爲您分配一個特殊的內存塊)。

您需要了解char *所做的分配(或任何類型的指針)。當你調用n=c時,你只是分配了指針,指針指向的內存仍然保留在原來的位置。所以,除非這正是你想要做的事情,否則你將有兩個指針指向同一塊內存......並且你需要決定刪除哪個(你不能刪除它兩次,那會很糟糕)。

我的建議是開始使用C++,所以沒有更多的char *類型,而是使用std :: string。使用char *是C編程。請注意,如果您確實使用了std :: string,並將其傳遞給assignChars,它將按照您的預期進行復制(並且不需要在析構函數中釋放std :: string對象,它們會處理所有這些對象)。

+0

是不是傳遞一個std :: string到assignchar()函數相當於傳遞該字符串的第一個字符? –

+0

我想你會希望n也是一個std :: string。把它看作是一個封裝的字符串類型..就是這樣。如果你想處理char *,那麼不需要複製指針,你需要strdup()。 – gbjbaanb

0

當您試圖刪除pC時會出現該問題。

~c()析構函數調用~b()析構函數 - 你試圖delete n;

問題是,assignchar(),n指向作爲參數("a")給出的字符串文字。

該字符串不是動態分配的,不應該被釋放,這意味着您應該刪除'delete n;'行,或者給一個動態分配的字符串作爲參數assignchar()