引用动态分配的变量vs指向同一动态分配的变量的指针?

时间:2015-02-12 02:59:41

标签: c++

案例-1:

int* func1() {
    return new int;
}

案例-2:

int& func2() {
    return *(new int);
}

是的,一个的返回值需要存储在指针变量中,而另一个需要存储在一个int变量中,如果我们忘记释放堆中的内存,它们都可能会产生内存泄漏。

所以,出于所有实际目的,它们是等价的,对吧?

2 个答案:

答案 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值。从技术角度来看,指针和引用在机器代码中被视为相同,主要区别在于编译器验证引用永远不会被赋值,但指针可以是。但从编码的角度来看,指针和引用是不同的编码语义,使用规则等等。