返回类中指针解引用的引用是否属于定义行为?
该C++类实现是否属于定义行为?
#include <iostream> struct Foo { int* n; Foo(){n = new int{};} ~Foo(){delete n;} int& get() { int* m = n; return *m; } }; int main() { Foo f; std::cout << f.get(); }
这个实现属于定义行为,具体分析如下:
Foo的构造函数通过new int{}分配了一块动态内存并初始化为0,析构函数负责在对象生命周期结束时释放这块内存。get()方法里的m是成员指针n的副本,二者指向同一块存活的动态内存;返回的*m引用,本质就是绑定到该内存中int对象的引用。- 在
main函数的执行流程中,Foo对象f的生命周期完全覆盖了std::cout << f.get()的操作:此时f尚未被析构,n指向的内存也未被释放,返回的引用绑定的是一个存活且有效的int对象,对其进行读取操作完全符合C++标准的定义行为。
需要额外注意:如果出现"返回引用后Foo对象被析构,再通过该引用访问内存"的场景,会触发未定义行为,但当前代码的执行逻辑不存在这个问题。
内容的提问来源于stack exchange,提问作者P45 Imminent
相关产品推荐
相关产品推荐

