C++ 引用重新分配
C++ Reference Reassignment
我在下面的代码中看到未定义的行为。我不能完全确定确切的问题,如果有人可以看一下并提供帮助,那将会很有帮助。下面是使用 gcc 6.3.1 构建的。
DBConn* dbconn = new DBConn();
DBConn& d = *dbconn; //reference
....
delete dbconn;
dbconn = new DBConn();
d = *dbconn;
DBConn 的赋值 (=) 运算符
DBConn& DBConn::operator =(const DBConn &rhs) {
if(this != &rhs) {
// deletes member variable pointers initialised with objects created using new operator
// deep copies some member variables
}
return *this;
}
- 当执行第二个
d = *dbconn
时,应用程序有时会崩溃。
- 是否
d = *dbconn
重新分配引用变量?
据我所知,当 d
的内存地址与 dbconn
不同时,应用程序将进入未定义的行为;在赋值运算符的重载方法中执行代码,因为 this != &rhs
.
删除 dbconn
后,引用 d
是 悬空 。
是的,之后访问 d
的行为是 未定义。 (注意指针值dbconn
在delete
之后是不确定。)
引用无法反弹,所以后续
d = *dbconn;
产生诊断结果。
我在下面的代码中看到未定义的行为。我不能完全确定确切的问题,如果有人可以看一下并提供帮助,那将会很有帮助。下面是使用 gcc 6.3.1 构建的。
DBConn* dbconn = new DBConn();
DBConn& d = *dbconn; //reference
....
delete dbconn;
dbconn = new DBConn();
d = *dbconn;
DBConn 的赋值 (=) 运算符
DBConn& DBConn::operator =(const DBConn &rhs) {
if(this != &rhs) {
// deletes member variable pointers initialised with objects created using new operator
// deep copies some member variables
}
return *this;
}
- 当执行第二个
d = *dbconn
时,应用程序有时会崩溃。 - 是否
d = *dbconn
重新分配引用变量?
据我所知,当 d
的内存地址与 dbconn
不同时,应用程序将进入未定义的行为;在赋值运算符的重载方法中执行代码,因为 this != &rhs
.
删除 dbconn
后,引用 d
是 悬空 。
是的,之后访问 d
的行为是 未定义。 (注意指针值dbconn
在delete
之后是不确定。)
引用无法反弹,所以后续
d = *dbconn;
产生诊断结果。