Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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()) { }