如何理解copy-constructior函数?

时间:2015-06-16 07:47:18

标签: c++ copy-constructor

    #include<iostream>
    #include<stdio.h>
    #include<string.h>

    class String{

    public:
            String(){}
            String(const char *ptr)
            {
                    pstr_= new char[strlen(ptr) + 1];
                    strcpy(pstr_,ptr);
            }
            String(const String &str)
            {
                    strcpy(this->pstr_,str.get_pstr());
            }

            ~String()
            {
                    delete pstr_ ;
            }

            char *get_pstr()
            {
                    return pstr_ ;
            }
    private:
            char *pstr_ ;

    };

    int main(int argc,char *argv[])
    {
            char *sh = "Hello World";
            String str(sh) ;
            String st(str) ;
            std::cout << str.get_pstr() << std::endl ;

            return 0 ;
    }

对不起,我的英语不好,帮助你理解我的意思。 我写了这样的代码。我确信它是正确的。但是,它会产生分裂错误。所以,我发现gdb有一个奇怪的现象。

38              std::cout << str.get_pstr() << std::endl ;
(gdb) n

Breakpoint 1, String::get_pstr (this=0x7fffffffe470) at String.cpp:26
26                      return pstr_ ;
(gdb) n
27              }
(gdb) n
Hello World
main (argc=1, argv=0x7fffffffe578) at String.cpp:40
40              return 0 ;
(gdb) n
37              String st(str) ;
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7282ba1 in __strlen_sse2 () from /lib64/libc.so.6

当程序运行返回0时,它可以重新运行String st(str)。   我很担心。帮助你解释一下。谢谢你!

2 个答案:

答案 0 :(得分:0)

所以,这里有两个问题。

崩溃是由于您没有在复制构造函数中分配新内存。将其与正常构造函数进行比较,然后在复制字符串之前正确执行此操作。

第二个问题是gdb在这种情况下表现得很混乱。您可能通过某种程度的优化来编译代码,以便允许编译器重新排序指令。因为在cout打印期间不需要复制构造的字符串,由于某种原因它被移过它,这就是gdb向你展示的内容。尝试重新编译您的代码而不进行优化,您应该看到按照您编写的顺序执行的指令。

答案 1 :(得分:0)

您还应该在复制构造函数中分配内存:

String(const String &str)
{
    pstr_= new char[strlen(ptr.get_pstr()) + 1];
    strcpy(this->pstr_,str.get_pstr());
}

或:

String(const String &str): String(str.get_pstr()) { }