参考重新分配 我有一个通用的C++问题。< /P>

参考重新分配 我有一个通用的C++问题。< /P>,c++,reference,heap-memory,C++,Reference,Heap Memory,假设我有以下代码: int& GetInt() { int* num = new int(); return *num; } int numCopy = GetInt(); 在这种情况下,返回的引用会发生什么情况?这个例子使用了一个简单的数据结构,所以这并不重要,但是在返回的数据更复杂的情况下,将一个变量分配给像这样的堆分配变量引用会将数据完全复制到numCopy,还是numCopy会成为原始num的另一个引用 在这种情况下,返回的引用会发生什么情况 它在完整表达式的

假设我有以下代码:

int& GetInt()
{
    int* num = new int();
    return *num;
}

int numCopy = GetInt();
在这种情况下,返回的引用会发生什么情况?这个例子使用了一个简单的数据结构,所以这并不重要,但是在返回的数据更复杂的情况下,将一个变量分配给像这样的堆分配变量引用会将数据完全复制到
numCopy
,还是
numCopy
会成为原始
num
的另一个引用

在这种情况下,返回的引用会发生什么情况

它在完整表达式的末尾超出了范围,您现在泄漏了在
GetInt
中获得的内存。您已经复制了引用引用的值,但无法再访问原始对象及其占用的内存

如果你有

int& foo = GetInt();
那你以后就可以做了

delete &foo;
不存在内存泄漏,但这仍然是一种糟糕的做法


或者
numCopy
会成为对原始
num
的另一个引用吗

只有在你明确要求的情况下,你才能得到推荐信

int numCopy = GetInt();

表示
numCopy
是一个
int
,而不是
int&
,因此它不会作为参考。C++具有所谓的“基本”,它的意思是除非您请求引用,否则所创建的对象是它自己的对象,它与其他对象无关。

在实际项目中,堆分配的变量将通过静态类被推到全局可访问的向量中,因此它仍然是可访问的。到目前为止,我一直在返回实际的指针(如num,而不是*num),但我想返回一个引用,因为它使语法更容易一些。因此,为了确保我的理解正确,没有办法强制执行,例如,将GetInt()赋值到的是引用,而不是函数的副本itself@MattanMohel对的你不能强制它被分配给一个引用。哦,好吧,那有点烦人。无论如何,非常感谢你。如果你选择返回指针,你甚至不能确保某个傻瓜不会取消引用指针并存储副本。请注意,对于他们的用例来说,他们的选择可能并不那么愚蠢。很难预测人们将如何使用您的API。大多数情况下,他们在画线外的时候会把它画出来,但有时他们会想出你从未想到过的非常非常酷的应用程序。在这种情况下,我可以将复制构造函数设置为私有,或者干脆将其删除。但你是对的,如果有人特意去做这件事,他们总是有机会知道自己在做什么。在这种情况下,指针对于没有经验的人来说会更安全,并且仍然允许灵活性,以便更高级地从堆分配的变量引用中分配变量。