Мне сложно понять умные указатели (все еще на начальных этапах изучения tbh). Может быть, я слишком долго занимался проблемой, и мне не хватает простой концепции ...
Я сейчас превращаю все свои «новые / удаляемые» в интеллектуальные указатели, поэтому у меня нет такой большой проблемы с утечками / повреждениями памяти.
С unique_ptr вы не можете просто:
PCHAR test;
std::unique_ptr<char[]> buffer = std::make_unique<char[]>(10);
buffer.get() = test;
(Пожалуйста, поправьте меня, если я ошибаюсь) Поэтому вместо этого я передаю необработанный shared_ptr, чтобы получить адрес байтов, которые мне нужно просмотреть в заголовках PE. pFileBase будет иметь байты "MZ", но мой shared_ptr не возвращается с этими байтами. Что мне не хватает?
Есть ли способ вернуть функции WinAPI в интеллектуальный указатель? Я также знаю, что мой shared_ptr не char [], так что это мой следующий шаг по исправлению.
BOOL InitializeFromDisk(std::wstring &wsTempPath, char *pFileBase)
{
...
pFileBase = (PCHAR)MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
if (pFileBase == 0) return FALSE;
return TRUE;
}
int main()
{
std::shared_ptr<char> pFile = std::make_shared<char>(0);
InitializeFromDisk(L"c:\\...", pFile.get());
...
PIMAGE_DOS_SIGNATURE pDosHdr;
std::copy(pFile, 2, pDosHdr); //I'm sure this line doesn't quit work yet
}
unique_ptr
из этого указателя (вам также нужно будет предоставить настраиваемый удалитель). ТакжеInitializeFromDisk
необходимо получить указатель по ссылке, иначе сайт вызова не увидит изменения значения указателя. - person NathanOliver   schedule 25.07.2017UnmapViewOfFile
должен вызываться после того, как OP будет выполнен с указателем, поэтому, если вы сделаете это в пользовательском устройстве удаления, вам больше не нужно будет помнить об этом. - person NathanOliver   schedule 25.07.2017stl
интеллектуальные указатели в таком коде, если он решает только небольшую часть вариантов использования, которые вам нужно охватить. - person MooseBoys   schedule 25.07.2017