🔴 循环引用:谁也不还
(本条路线统一用 g++ -std=c++17 -O0 -Wall 编译)上半段互相拿着,下半段把一边改成 weak_ptr:
#include <iostream>
#include <memory>
struct Res {
static int gone;
std::shared_ptr<Res> partner; /* 互相拿着对方 —— 这就是循环 */
~Res() { gone++; }
};
int Res::gone = 0;
struct Res2 {
static int gone;
std::weak_ptr<Res2> partner; /* 改成 weak,就不算一份 */
~Res2() { gone++; }
};
int Res2::gone = 0;
int main() {
{
auto a = std::make_shared<Res>();
auto b = std::make_shared<Res>();
a->partner = b;
b->partner = a;
}
int cyc = Res::gone; /* 两个都还没析构 */
{
auto a = std::make_shared<Res2>();
auto b = std::make_shared<Res2>();
a->partner = b;
b->partner = a;
}
int fixed = Res2::gone;
std::cout << cyc << "/" << fixed << "\n";
return 0;
}
全部评论