【问题标题】:what happens when the function returning value is a pointer and the returning type is a reference in c++?当函数返回值是指针并且返回类型是 C++ 中的引用时会发生什么?
【发布时间】:2026-02-23 08:55:02
【问题描述】:

伙计们,我刚从老师那里得到一个额外的问题!谢谢你帮助我!!

下面的sub2不会导致运行时错误,但可能还有其他一些 问题。有什么问题?

在此处输入代码

int& sub2 ( int& a , int& b ){
int * pc = new int ;
*pc = a - b ;
return (*pc ) ;
}

【问题讨论】:

  • 导致内存泄漏。
  • @πάνταῥεῖ:还没有。这取决于调用者如何捕获结果。到目前为止,这只是可怕的代码。
  • @πάνταῥεῖ:不一定。只是要求调用者跳过一个额外的箍以避免一个。
  • @πάνταῥεῖ 不幸的是你的提示是错误的。
  • @Christophe 该代码不会导致内存泄漏,期间。很有可能这样做,我认为这是问题的重点。但是说它会导致内存泄漏是有误导性的。

标签: c++ pointers reference


【解决方案1】:

此函数可能会导致内存泄漏。

  • 如果此函数的用户仅依赖于函数的签名,他将假定该函数返回对其他人拥有的对象的引用。因此,分配的对象将不会被释放。

  • 当然,如果用户知道这个技巧,他仍然可以通过获取引用的地址来删除对象

  • 如果函数用于更大的表达式(这很诱人,给定签名),例如sub(3, sub(2,1)),他将没有机会捕获临时引用。

请注意,如果内存分配存在问题,此函数也可能会抛出 bad_alloc

【讨论】:

  • 非常感谢!!我知道当用户不使用 delete() 时会导致内存泄漏,但为什么它会丢失临时引用? sub(2,1) 返回一个不引用可能导致该问题的局部变量的引用,但它引用了在堆中分配的指针,编译器无法自动删除它。我认为如果指针更改为int c,并且函数返回对局部变量c的引用,那么会导致引用问题,对吧?
  • 没错,如果你返回一个对局部变量的引用,这个局部变量将在返回时被销毁。所以引用指的是一个不再存在的对象(哎呀!)。事实上,最好的写法是按值返回:然后编译器自己管理所需的临时存储。
  • 请再次查看我的问题!现在不是局部变量,而是在堆中分配了一个真正的指针,在这种情况下,对指针的引用不会轻易脱节,那你为什么要主张第三种意见?
  • 因为 sub(3, sub(2,1)) 会导致 sub(2,1) 被调用。返回的引用将作为参数提供给 sub(3, ...)。一旦表达式被求值,所有的临时对象都会被销毁(即临时引用被销毁,而不是被引用的对象)。如果您没有提供代码(例如在析构函数中),编译器将永远不会自动删除使用 new 创建的对象。
最近更新 更多