Вопрос в названии ... Я искал, но ничего не смог найти.
Edit:
Я не вижу необходимости объяснять это, но поскольку люди думают, что то, что я говорю, не имеет смысла (и что я задаю неправильные вопросы), вот проблема:
Так как люди, кажется, очень заинтересованы в "коренной" причине всей проблемы, а не в самом задаваемом вопросе (так как это, очевидно, помогает решить проблемы лучше, давайте посмотрим, так ли это), вот проблема:
Я пытаюсь создать библиотеку времени выполнения D на основе NTDLL.dll, чтобы я мог использовать эту библиотеку для подсистем, отличных от подсистемы Win32. Так что это заставляет меня связываться только с NTDLL.dll.
Да, я знаю, что функции «недокументированы» и могут измениться в любое время (даже если бы я поспорил на сто долларов, что wcstombs
все равно будет делать то же самое точно вещь 20 лет, если он еще существует). Да, я знаю, что людям (особенно Microsoft) не нравятся разработчики, ссылающиеся на эту библиотеку, и что меня, вероятно, будут критиковать за право здесь. И да, эти два пункта выше означают, что такие программы, как chkdsk и defragmenters, которые запускают до подсистему Win32, даже не должны создаваться в первую очередь, потому что в буквальном смысле невозможно связать что-либо вроде kernel32. dll или msvcrt.dll и до сих пор имеют исполняемые файлы, родные для NT, поэтому мы, разработчики, должны просто притвориться, что эти этапы навсегда останутся за пределами нашей досягаемости.
Но нет , я сомневаюсь, что кто-то здесь хотел бы, чтобы я вставил несколько тысяч строк кода и помог мне просмотреть их и попытаться выяснить, почему отказывающие выделения памяти отклоняются Исходным кодом я модифицирую. Вот почему я спросил о проблеме, отличной от «первопричины», хотя якобы она известна сообществу как лучшая практика.
Если что-то все еще не имеет смысла, не стесняйтесь оставлять комментарии ниже! :)
Редактировать 2:
После примерно 8 часов отладки я наконец нашел проблему:
Оказывается, что RtlReAllocateHeap()
действительно не автоматически работает как RtlAllocateHeap()
, если указатель на него равен NULL
.