Human GetHuman() { Human h1;//构造一个对象 return h1; //返回时,如果对象实现了移动构造(默认没实现),则会移动构造外部值 } //如果没有移动构造(默认实现拷贝构造 - 位拷贝),拷贝构造外部值 //位拷贝只是将里面的指针复制过来,还是指向同个内存,所以临时变量被析构后, //外部值的成员就指向了被释放过的内存地址,生命周期结束后将再次析构造成崩溃
Human GetHuman2() { returnHuman(); //直接构造给外部值,不会产生临时变量,也不会调用自定义拷贝构造或者移动构造,只会进行位拷贝,谨慎 }
voidtestMoveConstruct() { Human h2 = GetHuman();//如果没有移动构造,将会调用拷贝构造,又涉及到深拷贝,但还是释放临时对象中产生的内存 h2.show(); //而移动构造直接使用临时对象中产生的内存,减少了一次new和delete的操作 system("pause"); } /* Human 构造 Human 移动构造 Human 析构 --- num:123 请按任意键继续. . . Human 析构 */
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
voidtestRValueRef1() { Human h2 = GetHuman2(); //因为直接构造给外部值作为临时变量,且这里是右值引用,所以生命周期随h2结束而结束 h2.show(); system("pause"); //h2 = GetHuman2(); //GetHuman2按位拷贝给h2,导致临时变量被析构后h2.num会指向被析构过的内存,h2生命周期结束再次delete num,崩 system("pause"); } /* Human 构造 --- num:123 请按任意键继续. . . 请按任意键继续. . . Human 析构 */