案例-1:
int* func1() {
return new int;
}
案例-2:
int& func2() {
return *(new int);
}
是的,一个的返回值需要存储在指针变量中,而另一个需要存储在一个int变量中,如果我们忘记释放堆中的内存,它们都可能会产生内存泄漏。
所以,出于所有实际目的,它们是等价的,对吧?
答案 0 :(得分:3)
不,从可读性的角度来看,这两者并不相同:当你返回一个指针时,你的代码的读者会想到该指针的所有权;当你返回一个引用时,他们肯定知道你拥有它。
API用户自然会删除您返回的指针。如果您的库保留了您通过指针返回的对象的所有权,那么您的API文档需要说明是否需要使用delete[]
或delete
删除指针,或者根本不删除指针。< / p>
您的API用户认为他们可能需要删除通过引用返回给他们的任何内容,这完全不自然。这并不意味着你不能这样做 - 你当然可以,但它会完全出乎意料,所以应该避免这样做。
答案 1 :(得分:1)
如果编译器足够智能,这两种情况可能会编译为相同的机器代码(我的编译器至少会编译),例如:
int* func1() {
return new int;
/*
push $04
call $00402afe
pop ecx
*/
}
int& func2() {
return *(new int);
/*
push $04
call $00402afe
pop ecx
*/
}
如果第二种情况的解引用/重新引用没有被优化掉,编译器可能会生成稍微不同的机器代码,那么它们本质上是相同的,因为调用者最终会收到一个内存地址。两种情况下分配的int
值。从技术角度来看,指针和引用在机器代码中被视为相同,主要区别在于编译器验证引用永远不会被赋值,但指针可以是。但从编码的角度来看,指针和引用是不同的编码语义,使用规则等等。