Я испытывал ряд случайных сбоев, используя класс MFC CFileDialog, поэтому я просмотрел их примерный код от this page, который гласит:Является ли этот пример Microsoft CFileDialog причиной потенциального нарушения памяти?
#define MAX_CFileDialog_FILE_COUNT 99
#define FILE_LIST_BUFFER_SIZE ((MAX_CFileDialog_FILE_COUNT * (MAX_PATH + 1)) + 1)
CString fileName;
wchar_t* p = fileName.GetBuffer(FILE_LIST_BUFFER_SIZE);
CFileDialog dlgFile(TRUE);
OPENFILENAME& ofn = dlgFile.GetOFN();
ofn.Flags |= OFN_ALLOWMULTISELECT;
ofn.lpstrFile = p;
ofn.nMaxFile = FILE_LIST_BUFFER_SIZE;
dlgFile.DoModal();
fileName.ReleaseBuffer();
wchar_t* pBufEnd = p + FILE_LIST_BUFFER_SIZE - 2;
wchar_t* start = p;
while((p < pBufEnd) && (*p))
p++;
if(p > start)
{
_tprintf(_T("Path to folder where files were selected: %s\r\n\r\n"), start);
p++;
int fileCount = 1;
while((p < pBufEnd) && (*p))
{
start = p;
while((p < pBufEnd) && (*p))
p++;
if(p > start)
_tprintf(_T("%2d. %s\r\n"), fileCount, start);
p++;
fileCount++;
}
}
По my reading этого, оператору fileName.ReleaseBuffer();
делает память указала в буфере переменной p
недействительной, так что оставшийся код несет ответственность испытывать нарушение памяти. В то же время я также предполагаю, что Microsoft проверила такие примеры до публикации. Я пропустил что-то очевидное здесь? Есть ли причина для использования CString
здесь через простой new
, за которым следует delete
после того, как буфер больше не требуется?
Никогда не предполагайте, что код примера является ошибкой. Будь то от Microsoft или от кого-то другого. Используя пример кода, все ошибки будут автоматически за вами. – j6t
Я этого не делаю, но я бы ожидал лучшего стандарта от Microsoft в примерах кода, которые поставляются с их документацией по API, поскольку этот код часто воспринимается как идиоматический способ использования API. Как показывают другие ответы здесь, в этом коде есть много чего не так. –
Это не документация по API Windows. Это MFC, библиотека, которая всегда имела документацию, отвечающую более низким стандартам, чем документация по Windows API. Несмотря на это, можно надеяться, что документация MFC и образец кода были правильными. Если бы у меня была надежда, я бы опубликовал отчет о дефекте, чтобы вход был включен. Я недостаточно доверчив, чтобы сохранить эту надежду. – IInspectable