간단한 c++코드인데 segment fault 발생합니다.
글쓴이: jee89 / 작성시간: 토, 2003/04/19 - 12:43오전
#include <iostream> #include <cstring> #include <string> class String { char* name; public: String( char *str = "default" ):name(str) {} void out(); String& operator=( const String& s ); String( const String& s); }; String::String( const String& s ) // copy constructor { name = new char[ strlen( s.name ) + 1 ]; strcpy( name , s.name ); cout << "copy constructor " << endl; } String& String::operator=( const String& s ) { delete [] name; name = new char[ strlen( s.name ) + 1 ]; strcpy( name , s.name ); return *this; } void String::out() { cout << name << endl; } int main() { String str( "Hello" ); str.out(); String a , b; a = b = str; // --> 여기서 segmentation fault return 0; }
operator = 부분에서 죽는데
어디가 잘못됐는지 모르겠네요
Forums:
생성자의 문제입니다.
디볼트 생성자를 따로 만들지 않고 멤버의 초기화 리스트로 구현하실려구 했는데.
String( char* str="default") : name(str){}
이때 str에는 new로 메모리가 할당되는게 아니라 malloc으로 할당됩니다. 그래서 operator=()가 작동할때 delete[]를 시도하면 당근 에러 땅! 납니다...
둘중에 하나만을 사용하셔야 할겁니다. 생성자를 바꾸시던지. 아님 메모리관련 부분은 모두 malloc, free로 바꾸시든지...
굴구 소멸자가 없는데 꼭 맹그시길..
헉. 어제밤에 답글을 올렸었는데 지워져 버렸군요. 다시 올립니다.
헉. 어제밤에 답글을 올렸었는데 지워져 버렸군요. 다시 올립니다.
C에서도 흔히 볼수 있는 오류입니다.
char *s = "hello world";
이런식으로 스트링을 초기화가 이루어 지면 "hello world"는 read only 메모리 영역에 들어가게 되고, pointer s는 그 메모리를 가리키게 됩니다.
이상태에서 free(s)를 해버리면 s가 가리키고 있는 메모리가 수정 불가능한 영역 이므로 access violation을 내게 됩니다.
님께서 작성하신 코드는 이와 동일한 오류를 가지고 있습니다.
님께서 작성하신 코드를 보면 처음 String class가 생성되며 name이라는 포인터는, 문자열상수 "default"를 저장하고 있는 read only영역을 가리키게 되고, operator=이 실행되며 'delete [] name;' 를 실행하게 되죠.
해결방법은 스스로 알고 계실듯 합니다. ^^;
♪ I'll play the blues for you. ♪
댓글 달기