gpt4 book ai didi

c++ - 为什么没有虚拟析构函数不会导致内存泄漏?

转载 作者:太空狗 更新时间:2023-10-29 19:42:56 26 4
gpt4 key购买 nike

<分区>

我在玩代码

struct A {
char a[20000];
A() { a[0] = 'A'; }
~A() {}
};
struct B : A {
char a[20000];
B() { a[0] = 'B'; }
~B() {}
};
int main() {
A *pA = new A;
A *pB = new B;
delete pA;
delete pB;
return 0;
}

有些人写道 ( why do we need a virtual destructor with dynamic memory? ) 它应该会导致内存泄漏,但事实并非如此。我使用了 g++,然后是 valgrind --leak-check=full --show-leak-kinds=all --track-origins=yes --verbose --log-file=valgrind- out.txt 得到

HEAP SUMMARY:
in use at exit: 0 bytes in 0 blocks
total heap usage: 3 allocs, 3 frees, 132,704 bytes allocated
All heap blocks were freed -- no leaks are possible

我知道一些旧的编译器在类似情况下尝试释放内存时会遇到问题,但看起来现代 C++ 可以在这种情况下无缝释放内存。所以我很好奇这怎么可能?也许delete 使用操作系统为给定的已分配内存块提供的信息?

编辑。如果我们有空的析构函数和构造函数,我仍然不清楚究竟是什么导致了 delete *pB 的 UB。一个问题的答案(Missing Virtual Destructor Memory Effects)表明没有任何 UB。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com