【问题标题】:C++ Reference ReassignmentC++ 引用重新分配
【发布时间】:2021-06-28 16:08:54
【问题描述】:

我在下面的代码中看到了未定义的行为。我不能完全指出确切的问题,如果有人可以看一下并提供帮助,那将有很大帮助。下面是使用 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;
}
  1. 执行第二个d = *dbconn 时,应用有时会崩溃。
  2. d = *dbconn 是否重新分配引用变量?

据我所知,当d 的内存地址与dbconn 不同时,应用程序将进入未定义行为;在赋值运算符的重载方法中执行代码,因为this != &rhs

【问题讨论】:

  • 永远不能重新分配引用。

标签: c++ pointers reference


【解决方案1】:

一旦dbconn 被删除,引用d悬空

是的,之后访问d 的行为是未定义。 (注意指针值dbconndelete 之后是indeterminate。)

引用不能被反弹,所以后续

d = *dbconn;

产生诊断。

【讨论】:

  • 可以肯定地说这段代码设计不正确吗?我假设原作者打算重用 d 并带有对新数据库连接的“更新”引用。有没有办法重用d
  • @user2780757:不。DBConn& d 基本上是一个悬空指针。以任何方式使用它都是未定义的并且可能会崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多