[완료] STL List에 동적 할당하는 멤버 변수 추가시...

mg2000의 이미지

제가 A라는 클래스를 만들고, 그 안에 문자열을 저장하고 싶어서, 아래와 같이 만들었습니다.

class A
{
private:
    char *str;
 
public:
    A()
    {
        str = NULL;
    }
 
    void SetStr(char *s)
    {
        if (str != NULL)
        {
            free(str);
            str = NULL;
        }
 
        str = (char *)malloc(sizeof(char) * strlen(s));
        strcpy(str, s);
    }
 
    char *GetStr()
    {
        return str;
    }
 
    ~A()
    {
        free(str);
    }
 
    A& operator=(const A& cA)
    {
        SetStr(cA.GetStr());
 
        return *this;
    }
}

이러한 클래스를 List로 저장하고 싶어서, STL의 list를 이용했는데요.

list<A> *listA = new list<A>();
 
A a;
a.SetStr("Kim");
 
listA.push_back(a);

요렇게 추가하도록 했는데요.

제 생각에는 a를 list에 넣을때, 할당 연산자를 이용해서 클래스 값을 가져올테니, list에 저장되는 A의

str값도 새로 메모리 할당을 하여 복사를 하겠지? 라고 생각을 했는데, operator=부분을 실행을 하지 않더라고요.

그래서 이부분이 있는 함수가 종료가 되면, a의 소멸자가 실행되면서, 할당한 값이 날라가서, list에 들어있는

A의 str값도 사용할 수 없게 됩니다. ㅠ.ㅠ

제가 잘못 이해하고 있는 부분이 있나요?

a도 new로 만들어서 넣어줘야 하는건지....

이런 경우에는 어떻게 구현을 해줘야 할까요?

imyejin의 이미지

복사생성자와 대입연산자가 각각 어느 때에 쓰이는지 공부하세요.

임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

kalstein의 이미지

원래...STL에서는 객체를 저런식으로 다룹니다. ㅡ.ㅡ;;

(생성자, 소멸자가 계속 불리겠죠?)

그걸 해결하려면...글쎄요. 포인터를 담는 형식으로 하셔야 될듯한데...또 포인터는 담아봐야 자동해제가 까다롭죠.

추천은 boost의 smart ptr을 사용하시는게 좋을것 같네요.

(boost에는 그거말고도 포인터용으로 쓸만한 STL 호환되는 list같은것도 제공됩니다)

-----------------------------------------
Let`s Smart Move!!
http://kalstein.tistory.com/


------------------------------------------
Let`s Smart Move!!
http://kalstein.tistory.com/

klara의 이미지

mg2000님께서 예상하지 못한 결과가 나온 이유는 imyejin님의 말씀대로 복사생성자와 대입연산자에 대해 알아보시면 답이 나올 듯하구요...
그보다 특별한 이유가 있어서 std::string을 쓸수 없는 상황이 아니라면 char*대신에 std::string을 쓰시길 추천합니다.
std::string은 이미 복사 생성자가 구현되어있기 때문에 A 클래스에서 따로 복사생성자를 구현하지 않더라도 자동으로 복사됩니다.

mg2000의 이미지

STL을 처음 쓸려고 하다보니, 이것저것 모르는게 많이 튀어나오는군요. ^^;;;;;;

C++ 공부도 좀 더 해야하겠고요..

답변주신 분들 모두 감사드립니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.