C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[60065] 악...감사합니다 ㅠㅠ 오타때문에 그런거였군요....ㅡ.,ㅡ;;허무...
이경준 [] 1122 읽음    2010-01-30 18:00
Nibble 님이 쓰신 글 :
: 이렇게 고치면 됩니다.
: 잘못된 할당 길이로 인해 뒷쪽 메모리까지 덮어쓰게 되는 경우죠.
:
: Phone::Phone(Phone &r)
: {
:     modelName = new char[strlen(r.modelName) + 1];   // 요부분이 잘못되어 있었네요. (r.company로)
:     strcpy(modelName, r.modelName);
:    
:     company= new char[strlen(r.company) + 1];
:     strcpy(company, r.company);
:    
:     price = r.price;
:     cout << "[부모 복사생성자]  \n";
: }
:
: 이경준 님이 쓰신 글 :
: : MP3Phone::MP3Phone(MP3Phone &r):Phone(r)
: :  {
: :      //player = new char[strlen(r.player)+1];
: :      //strcpy(player, r.player);
: :      player = r.player;                                     //바로위에 주석친부분이 바른 방식인데.. 포인터만 copy하네요
: :      cout << "[MP3자식 복사생성자]\n";
: :  }
: : player = r.player대신 주석을 실행시켜도 오류가 뜨는건 같은데..
: :
: : 저것도 해보고 올린거에요
: :
: : MP3Phone mp1(mp);
: :
: : mp1객체를 생성하고
: :
: : 자식쪽에선 player를 새로 동적할당한후에 복사를하고
: :
: : 부모쪽에선 modelName과 company를 새로 동적할당한후에 복사를 실행하는데
: :
: : 어찌 두번이 딜리트가 된다는건지 전 잘 이해가 안되네요..ㅠㅠ
: :
: :
: :
: :
: :
: :
: :
: :
: : 장성호 님이 쓰신 글 :
: : : 두번씩 삭제하고 있네요
: : :
: : :
: : :
: : : //다음 두줄만 보겠습니다.
: : : 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 [] 되는게 아닌가해서
: : : :
: : : : 자식 클래스의 소멸자에 딜리트도 삭제해봤지만 결과는 꽝이었구요..
: : : :
: : : :
: : : :
: : : :
: : : :
: : : : 부탁드려요...ㅠㅠ

+ -

관련 글 리스트
60059 초보적인 질문하나드려요!! class상속과 동적할당 관련... 이경준 2335 2010/01/29
60061     Re:초보적인 질문하나드려요!! class상속과 동적할당 관련... 장성호 1183 2010/01/30
60063         Re:Re:초보적인 질문하나드려요!! class상속과 동적할당 관련... 이경준 1083 2010/01/30
60064             Re:Re:Re:초보적인 질문하나드려요!! class상속과 동적할당 관련... Nibble 1222 2010/01/30
60065                 악...감사합니다 ㅠㅠ 오타때문에 그런거였군요....ㅡ.,ㅡ;;허무... 이경준 1122 2010/01/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.