我目前正在为我的C++代码的某些功能(它是我主要为了教育目的而编写的游戏引擎)编写一些基本测试。我想测试的功能之一是内存分配代码。如果代码处于调试模式,测试目前由一个运行每次启动的函数组成。这迫使我在调试时总是测试代码。测试C++代码和IsBadWritePtr
为了测试我的内存分配的代码我的直觉是做这样的事情:
int* test = MemoryManager::AllocateMemory<int>();
assert(!IsBadWritePtr(test, sizeof(int)), "Memory allocation test failed: allocate");
MemoryManager::FreeMemory(test);
assert(IsBadWritePtr(test, sizeof(int)), "Memory free test failed: free");
此代码工作正常,但所有我能找到的资源都说不要使用IsBadWritePtr
功能(这是一个WinAPI功能适用于那些不熟悉的)。在这种情况下使用此功能是否正常?对使用它的三个主要的警告,我发现是:
这可能会导致问题与防护页面
这不是一个问题,因为内存分配的代码就在那里,我知道我不分配保护页。
这是更好地失败较早
这不是因为我硬是用它来尽早失败的思考。
它不是线程安全的
测试代码是正确的,在执行的开始执行,很久以前任何其他线程存在。它也作用于没有其他指针创建的内存,因此不能存在于其他线程中。
所以基本上我想知道在这种情况下使用这个函数是否是一个好主意,以及如果有什么我失踪的函数。我也意识到指向错误位置的东西仍然会通过这个测试,但它至少能检测到大部分内存分配错误,对(如果分配失败,我有机会获得指向有效内存的机会?)
好的,这是有道理的。至于为什么这只发生在调试模式下,我的测试的一部分是分配器工作正常。它分配一个小内存,测试它被分配,释放它,然后测试它是免费的。这是为了确保分配器正在工作并提前失败,而不是等待它被使用。当我使用它时,代码中还有一些检查,但我认为将内存分配器放在测试之外是一件非常重要的事情。 –