为什么用智能指针创建临时变量 p1,但是打印的地址都是相等的呢?
class Demo {
public:
void show() {
printf("age=%d\n", age);
}
private:
const int age = 10;
};
int main() {
for (int i = 0; i < 10; i++) {
std::shared_ptr<Demo> p1 = std::make_shared<Demo>();
printf("%p, %p\n", &p1, p1.get());
}
return 0;
}
输出是:
0x16d42f548, 0x122e06808
0x16d42f548, 0x122e06808
0x16d42f548, 0x122e06808
0x16d42f548, 0x122e06808
0x16d42f548, 0x122e06808
0x16d42f548, 0x122e06808
0x16d42f548, 0x122e06808
0x16d42f548, 0x122e06808
0x16d42f548, 0x122e06808
0x16d42f548, 0x122e06808
在为变量、对象分配空间的时候,只要编译器、运行时认为一片空间没有正在被使用,它就有理由复用这一片的空间。
这里的 p1 是循环内部的一个局部变量,它在每次循环的结束的时候就被释放了,它所指向的 Demo 的空间也随着它一起被释放了。所以当下一轮循环开始的时候,编译器、运行时就完全有理由复用上次的空间。所以就看到了每次地址都是相同的。
p1 的空间一般是被编译器分配的,循环体内部的局部变量一般每轮循环都会被放在同一个位置。
Demo 的空间是运行时分配的。具体分配算法得看运行时的具体实现。不过这种同一个类型的变量被连续反复分配释放的情况,放在同一个地址是正常的。在下一次分配的时候,上一次的分配结果已经被释放了。