2013-10-09 3 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++에서 멍청한 놈입니다. 내가 왜 VS2010에서 메모리 손상 메시지를 계속 이해하는지 모르겠다. 나는 더 작은 비트로 그것을 분해함으로써 높은 수준에있는 문제를 복제하려고하는데, 어떤 도움을 주시면 감사하겠습니다.내 코드를 실행하는 동안 메모리 손상이 발생했습니다.

답변

0

커서가 눈에 띄지 않기 때문에 삭제할 수없는 정적 문자 배열을 AssignChar에 전달합니다. 즉, 코드에 "A"를 입력하면 컴파일러에서 할당하는 특수 메모리 블록이됩니다.

char *의 할당 (또는 입력 할 포인터)을 이해해야합니다. n=c으로 전화를 걸면 포인터가 할당 된 것입니다. 포인터가 가리키는 메모리는 그대로 남아 있습니다. 그래서 이것이 정확히 의도하지 않는 한, 같은 포인터를 가리키는 2 개의 포인터가 있습니다. 그리고 삭제할 대상을 결정해야합니다 (두 번 삭제할 수는 없습니다).

여기 내 조언은 C++을 사용하기 시작한 것이므로 더 이상 char * 형식이 아닌 std :: string을 사용하십시오. char * 사용은 C 프로그래밍입니다. std :: string을 사용하고 assignChars으로 전달한 경우 예상대로 복사합니다 (소멸자에서 std :: string 객체를 해제 할 필요가 없으며 모든 것을 처리합니다).

+0

은 해당 문자열의 첫 번째 문자를 전달하는 것과 동일한 assignchar() 함수에 std :: string을 전달하지 않습니다. –

+0

나는 n이 std :: string이기를 원한다고 생각한다. 캡슐화 된 문자열 유형이라고 생각하면됩니다. char *를 다루고 싶다면 포인터를 복사하는 대신에 strdup()가 필요하다. – gbjbaanb

0

pC을 삭제하려고 할 때 문제가 발생합니다.

~c() 소멸자가 ~b() 소멸자를 호출 할 때 - delete n;을 시도하고 있습니다.

assignchar() 이후에 n은 인수 ("a")에 주어진 문자열 리터럴을 가리키는 것이 문제입니다.

문자열이 동적으로 할당되지 않아 해제되어서는 안됩니다. 즉, 'delete n;'을 제거해야합니다. 동적으로 할당 된 문자열을 assignchar()에 인수로 지정하십시오.

관련 문제