Я попытался построить очень минималистичную библиотеку чтения памяти, чтобы прочитать ее из unsigned int
. Тем не менее, я нахожу сообщение об ошибке «HEAP CORRUPTION DETECTED», когда метод ReadUnsignedInt
хочет вернуться.Как исправить кучевое повреждение
ОБОСНОВАННАЯ КОРРУПЦИЯ HEAP. CRT обнаружил, что приложение записано в память после окончания буфера.
Как я уже говорил, это может быть причиной при попытке удвоить что-то удалить. Это может быть вызвано некорректным использованием std::tr1::shared_ptr
, но я не могу определить, что я делаю с ними неправильно. Код выглядит следующим образом (обработка ошибок опущена):
unsigned int Memory::ReadUnsignedInt (unsigned int address) const {
std::tr1::shared_ptr<byte> bytes =
this->ReadBytes(address, sizeof(unsigned int));
return *((int*)bytes.get());
// correct value (how to improve this ugly piece of code?)
}
std::tr1::shared_ptr<byte> Memory::ReadBytes (
unsigned int address, int numberOfBytes) const
{
std::tr1::shared_ptr<byte> pBuffer(new byte(numberOfBytes));
ReadProcessMemory(m_hProcess.get(), (LPCVOID)address,
pBuffer.get(), numberOfBytes * sizeof(byte), NULL))
return pBuffer;
}
Отличная уловка - хотя это было бы тихой ошибкой на большинстве платформ, так как байт не имеет деструктора, который нужно назвать, правильным ответом здесь будет использование вектора вместо shared_ptr. – Michael
... или shared_array для этого вопроса (я думаю). – peterchen
Обновлено. Я изучал, как добавить пользовательский деструктор в 'shared_ptr', но это больше усилий, чем того стоит. – ephemient