function/method returns 对对象的引用如何在内部工作
how function/method returns reference to object works internally
这可能是重复的,但假设我们有以下代码
#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 %s\n", 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 检查,则没有内存泄漏 - 例如在正确的 "place".
上调用析构函数
这引发了以下问题:
createPair()
里面到底发生了什么?看起来对象内存被复制了。它是类似于 memcpy() 还是与复制构造函数有关?
- usePair() 获取引用,然后 return 返回相同的引用。由于引用的对象仍在 main() 范围内,这应该是 安全的 操作 - 这个假设正确吗?
- 在创建 Pair 中构造一个对象,然后 returned。这涉及复制构造函数(如果 Pair 实现了 Move 构造函数,则可以避免)。此外 RVO(return 值优化)可能有助于避免不必要的复制)
- usePair 处理引用,这里没有复制。完全没问题。
P.S。声明 IPair 虚拟的析构函数...
类似复制构造函数——如果没有提供构造函数,编译器会生成一个,本质上就是memcpy(*this, rhs, sizeof(*this));
。 Return 值优化,即编译器传入目标地址以存储值 - 在大多数情况下无需复制。 [实际上,所有 structure/class returnes 都会修改调用,以便编译器将要 returned 的对象作为参考参数传递]
引用与 C++ 中的指针几乎相同,因此当您 return 引用时,对象的地址是 returned。不同之处在于引用不需要取消引用运算符,并且只能分配一次。
这可能是重复的,但假设我们有以下代码
#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 %s\n", 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 检查,则没有内存泄漏 - 例如在正确的 "place".
上调用析构函数这引发了以下问题:
createPair()
里面到底发生了什么?看起来对象内存被复制了。它是类似于 memcpy() 还是与复制构造函数有关?- usePair() 获取引用,然后 return 返回相同的引用。由于引用的对象仍在 main() 范围内,这应该是 安全的 操作 - 这个假设正确吗?
- 在创建 Pair 中构造一个对象,然后 returned。这涉及复制构造函数(如果 Pair 实现了 Move 构造函数,则可以避免)。此外 RVO(return 值优化)可能有助于避免不必要的复制)
- usePair 处理引用,这里没有复制。完全没问题。
P.S。声明 IPair 虚拟的析构函数...
类似复制构造函数——如果没有提供构造函数,编译器会生成一个,本质上就是
memcpy(*this, rhs, sizeof(*this));
。 Return 值优化,即编译器传入目标地址以存储值 - 在大多数情况下无需复制。 [实际上,所有 structure/class returnes 都会修改调用,以便编译器将要 returned 的对象作为参考参数传递]引用与 C++ 中的指针几乎相同,因此当您 return 引用时,对象的地址是 returned。不同之处在于引用不需要取消引用运算符,并且只能分配一次。