【发布时间】:2019-11-09 13:59:33
【问题描述】:
我在玩代码
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。
【问题讨论】:
-
未定义的行为是未定义的。它可能会做你想做的事,也可能做其他事情。 -
非常感谢您的链接。
-
"也许 delete 使用操作系统为给定分配的内存块提供的信息?"不,这是一个实现细节,可能因平台而异。据我所知,没有任何平台会使用操作系统提供的信息来做类似的事情。在我的平台上,分配器有一些簿记,它跟踪为该指针在堆中为对象分配了多少字节(在调试版本中为栅栏分配了额外的内存,
new、@987654326 有单独的堆@ 和malloc)。
标签: c++ memory-management memory-leaks virtual destructor