用栈局部对象值为堆指针指向对象赋值是否为未定义行为?u指针何时被删除?
1. 栈局部对象e赋值给堆对象*d是否属于未定义行为?
完全不属于未定义行为。这里的*d = e是赋值操作,本质是把栈上对象e的内容拷贝到指针d指向的堆内存对象里。由于类A没有自定义赋值运算符,编译器会生成默认的逐成员赋值逻辑,而A类内部没有管理任何动态资源(比如堆指针、外部句柄),所以这个拷贝过程是安全合法的。
当f函数执行完毕时,栈上的e会被销毁(触发析构输出~A),但此时堆对象*d已经完成了内容拷贝,e的销毁不会对它造成任何影响。
2. 指针u指向的对象何时被删除?
u指向的堆对象会在main函数执行到delete u;语句时被销毁,同时触发A类的析构函数输出~A。
另外要明确:f里的局部对象e的销毁时机是f函数结束时(栈帧弹出),这和u指向的堆对象的生命周期完全无关,两者各自管理自己的内存。
内容的提问来源于stack exchange,提问作者tTt
相关产品推荐
相关产品推荐

