C ++返回引用堆栈分配详细信息

时间:2016-08-03 10:03:57

标签: c++

有人可以完全了解此运算符重载函数中内存的变化吗?我很困惑在运算符函数内创建的对象如何在主函数中被解除分配。

Object& operator+(const Object& other) {
  Object o(*this); //create instance of o that deep copies first argument
  ...
  //copy contents of other and add onto o
  return o;
}
int main() {
  Object b;
  Object c;
  Object a = b + c;
}

编辑:更具体一点,在函数中创建本地对象然后通过引用返回它不是不好的做法吗?这不会导致内存泄漏吗?

编辑2:我正在引用我的教科书数据抽象&amp;使用c ++ carrano解决问题,它建议使用此格式的LinkedLists的运算符+重载:LinkedList<ItemType>& operator+(const LinkedList<ItemType>& rightHandSide) const;。他们以我描述的方式实现了该方法。

编辑2.5:本书给出的完整方法伪代码:

LinkedList<ItemType>& operator+(const LinkedList<ItemType>& rightHandSide) const {
  concatList = a new, empty instance of LinkedList
  concatList.itemCount = itemCount + rightHandSide.itemCount
  leftChain = a copy of the chain of nodes in this list
  rightChain = a copy of the chain of nodes in the list rightHandSide
  concatList.headPtr = leftChain.headPtr
  return concatList
}

编辑3:向我的教授询问此事。明天就会到底。

编辑4:这本书错了。

3 个答案:

答案 0 :(得分:3)

返回对本地对象的引用

正如其他人正确指出的那样,返回对本地对象的引用会导致未定义的行为。最终会得到一个被破坏的函数范围对象的句柄。

返回算术运算符

中的引用

如果您考虑一下,$sql = "SELECT group_concat(id separator ',') as id FROM `loc8_groups`"; $query = $this->db->query($sql); $array1 = $query->row_array(); $arr = explode(',',$array1['id']); print_r($arr); 应该会给您一个结果,但不应该更改a+ba。但是,C ++会让您自己定义运算符如何处理您自己的类型,因此可以实现您需要的行为。这就是b通常必须创建一个新对象而不能返回引用的原因。

另一方面,复合作业(operator++=等)会更改对象本身,因此-=正在更改a += b。这就是为什么它通常通过返回引用(不是本地对象,而是实例本身)来实现的原因:

a

答案 1 :(得分:2)

只是未定义的行为

就内存发生的情况而言,在函数返回后,内存不会保留给对象(因为对象现在已超出范围)。

所以它可以包含ANYTHING,包含同一个巧合的对象

答案 2 :(得分:2)

它不会导致内存泄漏,但是当函数返回时,o在超出范围时会被破坏。所以调用者的参考是垃圾。 可能会在短时间内正常工作,直到稍后覆盖内存为止。