간단한 c++코드인데 segment fault 발생합니다.

jee89의 이미지

#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 = 부분에서 죽는데
어디가 잘못됐는지 모르겠네요

익명 사용자의 이미지

디볼트 생성자를 따로 만들지 않고 멤버의 초기화 리스트로 구현하실려구 했는데.

String( char* str="default") : name(str){}

이때 str에는 new로 메모리가 할당되는게 아니라 malloc으로 할당됩니다. 그래서 operator=()가 작동할때 delete[]를 시도하면 당근 에러 땅! 납니다...

둘중에 하나만을 사용하셔야 할겁니다. 생성자를 바꾸시던지. 아님 메모리관련 부분은 모두 malloc, free로 바꾸시든지...

굴구 소멸자가 없는데 꼭 맹그시길..

dreamt의 이미지

헉. 어제밤에 답글을 올렸었는데 지워져 버렸군요. 다시 올립니다.

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. ♪

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.