今天早些时候,我问这个问题 。
花一些时间来调查这个问题之后,我发现这是怎么回事。 因为我觉得这是很有趣,足以跟踪作为一个单独的问题我张贴这是一个新问题。 我会更新的答案(和这一个链接)这个问题。
启动从调试器单元测试
// Construct object
Object* pObject = new Object(...);
// Pointer value of pObject == 0x05176960
// Lots of other code
// ...
// Destroy object
delete pObject;
// Construct object again
pObject = new Object(...);
// Pointer value of pObject == 0x05560194 /* Different memory location */
从命令行启动单元测试
// Construct object
Object* pObject = new Object(...);
// Pointer value of pObject == 0x05176960
// Lots of other code
// ...
// Destroy object
delete pObject;
// Construct object again
pObject = new Object(...);
// Pointer value of pObject == 0x05176960 /* Same memory location */
综上所述:
- 当启动命令行的单元测试,随后将呼叫
new
分配的Object
(delete
荷兰国际集团先前的Object
分配一个新的前)总是在内存中返回相同的地址。 - 当从调试器启动单元测试,随后将呼叫
new
分配的Object
(delete
荷兰国际集团先前的Object
分配一个新的前)总是在内存中返回一个唯一的地址。
问题是,由于分配Object
总是在内存中通过命令行启动时,会得到相同的地址仍然可以使用的地图,我访问已存储的旧指针和测试将不会崩溃。 但我想我的单元测试崩溃时的缺陷修复不到位,以确保它不会默默地消失,缺陷不回来。
有2个部分,我的问题:
在命令行推出的单元测试时,为什么要堆管理器重复使用相同的内存部分,但不是当我从调试器启动单元测试?
是否有一个编译器设置,我可以在我的测试工具使用,或者我可以调用,以防止堆管理器从我已删除的内存的一部分,让我正确地写我的单元测试重新使用的方法? 1
1个显然,这样做的一个方法是不删除原来的对象,而是分配该代码的部分是我的生产代码,我这样做会导致内存泄漏。