두번씩 삭제하고 있네요
//다음 두줄만 보겠습니다.
MP3Phone mp("경준","FGH-IJ","LG",400000); //1)
MP3Phone mp1(mp); //2)
위에 1)과정에서는 다음함수가 호출되죠
MP3Phone::MP3Phone(char *pP,char *pM, char *pC, int p):Phone(pM, pC, p)
{
player = new char[strlen(pP)+1]; //이때 player를 메모리 할당해서
strcpy(player, pP); // 내용을 복사하네요
cout << "[MP3자식 생성자]전달값으로 초기화\n";
}
그리고 2)과정은 다음과 같죠
MP3Phone::MP3Phone(MP3Phone &r):Phone(r)
{
//player = new char[strlen(r.player)+1];
//strcpy(player, r.player);
player = r.player; //바로위에 주석친부분이 바른 방식인데.. 포인터만 copy하네요
cout << "[MP3자식 복사생성자]\n";
}
이제 함수가 종료될때 mp도 mp1도 delete되면서 다음 소멸자가 호출될것입니다.
MP3Phone::~MP3Phone()
{
delete [] player; //mp.player도 mp1.player도 같은 내용이 아니라
//같은 포인터이기때문에 두번 delete되네요
cout << "[MP3자식 소멸자]동적할당 해제\n";
}
그럼..
이경준 님이 쓰신 글 :
: 안녕하세요
:
: 에러를 찾을수가없어서 이렇게 질문드려요...ㅠㅠ
:
:
: 파일을 첨부했는데...
:
: Phone class가 부모구요
:
: MP3Phone class와 CameraPhone class가 자식 클래스인 코드인데요..
:
:
:
: 메인함수에 주석처리된부분
:
: //MP3Phone mp1(mp);
: //CameraPhone cam1(cam);
:
:
: 주석을 없애고 실행을 시키면실행은 되는데
:
: 디버깅 에러 라는 경고창이 뜨네요..
:
:
:
: 출력문구를보고 예측을해보면 동적할당을 해제하는 부분에서 뭔가 잘못된거 같습니다..
:
: 주석처리된 출력명령어를 주석을 지우고 실행을 시켜보면
:
: 복사는 된걸로 보입니다..
:
:
:
:
: 객체를 생성하고 복사를해서 복사 생성자를 콜하게되는데
:
: 콜하는도중 부모클래스와 관련해서 뭔가 잘못된거 같기도하고요...
:
:
:
: 부모클래스없이 하나의 클래스만으로
:
: 같은 형식으로 복사생성자를 콜하면 이상없이 돌아가는데 말이죠..
:
:
:
: 혹시 두번 delete [] 되는게 아닌가해서
:
: 자식 클래스의 소멸자에 딜리트도 삭제해봤지만 결과는 꽝이었구요..
:
:
:
:
:
: 부탁드려요...ㅠㅠ