函数/方法如何在内部返回对对象的引用

how function/method returns reference to object works internally

本文关键字:对象 引用 返回 在内部 方法 函数      更新时间:2023-10-16

这可能是重复的,但假设我们有以下代码

#include <stdio.h>
#include <stdlib.h>
class IPair{
public:
    IPair(const char *s) : s(s){
        buffer = malloc(1024);
    };
    virtual ~IPair(){
        free(buffer);
    }
    virtual void print() const = 0;
    const char *s;
    void *buffer;
};
class Pair : virtual public IPair{
public:
    Pair(const char *s) : IPair(s){};
    virtual void print() const override{
        printf("Hello %sn", s);
    }
};
Pair createPair(const char *s){
    return Pair(s);
}
IPair & usePair(IPair &pair){
    pair.print();
    return pair;
}
int main(int argc, char** argv)
{
    Pair a = createPair("AAA");
    Pair b = createPair("BBB");
    usePair(a);
    IPair &x = usePair(b);
    usePair(x);
    return 0;
}

如果使用valgrind进行检查,则不存在内存泄漏——例如,在正确的"位置"调用了析构函数。

这引发了以下问题:

  1. createPair()内部究竟发生了什么?看起来对象内存已复制。它是类似memcpy(),还是与复制构造函数有关
  2. usePair()获取引用,然后返回相同的引用。由于引用的对象仍在main()范围内,因此这应该是safe操作-这种假设正确吗
  1. 与复制构造函数一样,如果没有提供构造函数,编译器将生成一个构造函数,它本质上是memcpy(*this, rhs, sizeof(*this));。返回值优化,即编译器传入目标地址以将值存储在中-在大多数情况下不需要副本。[实际上,所有结构/类的返回都会修改调用,以便编译器将要返回的对象作为引用参数进行传递]

  2. 引用与C++中的指针几乎相同,因此当您返回引用时,将返回对象的地址。不同之处在于引用不需要解引用运算符,并且只能分配一次。

  1. 在create Pair中,将构造一个对象,然后返回。这涉及到复制构造函数(如果Pair实现了Move构造函数,则可以避免)。此外,RVO(返回值优化)可能有助于避免不必要的复制)
  2. usePair处理引用,此处不会发生复制。完全可以

第页。S.声明IPair虚拟的析构函数。。。