Ранее сегодня я задал этот вопрос .
Потратив некоторое время на изучение этой проблемы, я обнаружил, что происходит.Я публикую это как новый вопрос, потому что считаю его достаточно интересным, чтобы его можно было рассматривать как отдельный вопрос.Я обновлю этот вопрос ответом (и ссылкой на него).
Запуск юнит-теста из отладчика
// 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
всегда получают один и тот же адрес в памяти при запуске через командную строку, карта, к которой я обращаюсь и в которой хранится указатель old , все еще можетбудет использоваться, и тест не потерпит крах.Но я хочу, чтобы мой модульный тест завершился сбоем, когда исправление дефекта не было установлено, чтобы убедиться, что оно не завершается сбоем и дефект не возвращается.
На мой вопрос есть 2 части:
Почему диспетчер кучи повторно использует ту же часть памяти при запуске модульного теста из командной строки, а не при запуске модульного теста из отладчика?
Есть ли настройка компилятора, которую я мог бы использовать на своем тестовом жгуте, или метод, который я могу вызвать, чтобы предотвратить повторное использование менеджером кучи удаленного раздела памяти, чтобы позволить мне правильнонаписать мой юнит тест? 1
1 Очевидно, что один из способов сделать это - не удалить исходный объект, а часть кода, котораявыделяет это в моем производственном коде, и это может привести к утечкам памяти.