C++ 如何理解复制构造函数的功能? #包括 #包括 #包括 类字符串{ 公众: 字符串(){} 字符串(常量字符*ptr) { pstr=新字符[strlen(ptr)+1]; strcpy(pstr,ptr); } 字符串(常量字符串和str) { strcpy(这个->pstr,str.get\pstr()); } ~String() { 删除pstr; } char*get\pstr() { 返回pstr; } 私人: char*pstr; }; int main(int argc,char*argv[]) { char*sh=“你好,世界”; 字符串str(sh); 串st(str); 所以,这里有两个问题
崩溃是由于您没有在复制构造函数中分配新内存造成的。请将其与正常构造函数进行比较,在复制字符串之前正确地分配内存C++ 如何理解复制构造函数的功能? #包括 #包括 #包括 类字符串{ 公众: 字符串(){} 字符串(常量字符*ptr) { pstr=新字符[strlen(ptr)+1]; strcpy(pstr,ptr); } 字符串(常量字符串和str) { strcpy(这个->pstr,str.get\pstr()); } ~String() { 删除pstr; } char*get\pstr() { 返回pstr; } 私人: char*pstr; }; int main(int argc,char*argv[]) { char*sh=“你好,世界”; 字符串str(sh); 串st(str); 所以,这里有两个问题,c++,copy-constructor,C++,Copy Constructor,崩溃是由于您没有在复制构造函数中分配新内存造成的。请将其与正常构造函数进行比较,在复制字符串之前正确地分配内存 第二个问题是gdb在这种情况下的行为令人困惑。您可能在编译代码时进行了某种程度的优化,这样编译器就可以对指令进行重新排序。由于在cout打印期间不需要复制构造的字符串,出于某种原因,它被移过了它,这就是gdb向您展示的内容。尝试在不进行优化的情况下重新编译代码,您将看到指令按照编写顺序执行。您还应在复制构造函数中分配内存: 38 std::cout <&
第二个问题是gdb在这种情况下的行为令人困惑。您可能在编译代码时进行了某种程度的优化,这样编译器就可以对指令进行重新排序。由于在cout打印期间不需要复制构造的字符串,出于某种原因,它被移过了它,这就是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
或:
谢谢你。我可以用你的方法来执行我的代码。所以我觉得我应该学习更多的知识。你是个好人。正如你所说,我太粗心了,以至于忘记了写内存分配。谢谢你的回答。也许我以后应该更小心。不客气。我看到你是Stackoverflow的新手:别忘了向上投票并接受任何有用的信息回答你的问题!看一看。干杯!
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
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()) { }