我一直在使用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
无效,使得剩下的代码是容易出现内存违规行为。同时,我还假设微软在发布之前会检查这些例子。我在这里错过了很明显的东西吗在不再需要缓冲区后,是否有任何理由在这里使用CString
,而不是简单地使用new
,然后使用delete
?
永远不要假设示例代码是无缺陷的。无论是来自微软还是其他人。通过使用示例代码,所有错误都是自动的。 – j6t
我不这样做,因此我发布了这篇文章,但我希望微软在其API文档中提供的代码示例中有一个更好的标准,因为此代码通常被视为应该使用API的惯用方式。正如这里的其他答案所示,这段代码有很多错误。 –
这不是Windows API文档。它是MFC,一个图书馆,它一直有文档符合比Windows API文档更低的标准。无论如何,人们会希望MFC文档和示例代码也是正确的。如果我有任何希望,那么我会提交一份缺陷报告,说明输入已经合并。我不够容易维持这个希望。 – IInspectable