[问题] class中动态分配内存的存活时间

楼主: nicknick0630 (NICK)   2018-01-28 18:07:01
开发平台(Platform): (Ex: Win10, Linux, ...)
win10
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
vs 2017
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)

问题(Question):
小弟是C++新手也是第一次发文
请鞭小力一点><
我设计一个class Test中有宣告一个 int *arr
让他在constructor中可以分配内存
像 arr=new int[10]
然后我也用了destructor
会把arr delete掉
另外我也设计了一个成员函式
会先复制本身数据到temp中
再把temp.arr内存中的值都加一
并回传temp给另一个Test型态的变量
像 b=a.addOne();
我想问的是
b在使用operator=设值的时候
不是会用到a.addOne()回传的东西吗
但它在离开了addOne()函式的时候不是就应该会被destructor delete掉了吗
为什么b还可以存取
喂入的资料(Input):

预期的正确结果(Expected Output):
错误结果(Wrong Output):
程式码(Code):(请善用置底文网页, 记得排版)
http://codepad.org/2QRdsFU5
补充说明(Supplement):
作者: jerryh001   2018-01-28 18:16:00
回传出来的是复制品 另外第10行有写错
作者: LPH66 (-6.2598534e+18f)   2018-01-28 19:39:00
addOne() 回传的是 temp 的复制品, temp 被删了没错但那个复制品传给了 b.operator = 去复制过去
作者: phishingphi (hsnutontu)   2018-01-28 20:20:00
C++17中这个case(应该)符合 guaranteed copy elison.见 P0135R1 或 [class.copy.elision]。但我自己的疑问是那个 new 会不会导致那个 criteria 不符合...
作者: jerryh001   2018-01-28 21:09:00
你有写copy ctor 所以arr是不同地址 你可以印出来看看另外delete后再存取是未定义行为 不管实际上读不读的到资料 都不应该做
作者: LPH66 (-6.2598534e+18f)   2018-01-29 01:21:00
其实只要你有遵守好 rule of three/rule of five把对应的东西通通实作正确那其实不管怎么呼叫都没问题

Links booklink

Contact Us: admin [ a t ] ucptt.com