【发布时间】:2017-06-19 14:02:37
【问题描述】:
我在使用 MFC CFileDialog 类时遇到了一些随机崩溃,因此我查看了来自 this page 的示例代码,内容如下;
#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();使得缓冲区变量pinvalid指向的内存,使得剩余的代码容易发生内存冲突。同时,我还假设微软会在发布这些示例之前对其进行检查。我在这里遗漏了一些明显的东西吗?在不再需要缓冲区后,是否有任何理由在此处使用 CString 而不是简单的 new 后跟 delete?
【问题讨论】:
-
永远不要假设示例代码没有错误。无论是来自微软还是来自其他人。通过使用示例代码,所有错误都会自动归您所有。
-
我没有,因此这篇文章,但我希望 Microsoft 在其 API 文档附带的代码示例中提供更好的标准,因为此代码通常被视为惯用的方式应该使用 API。正如这里的其他答案所示,这段代码有很多问题。
-
这不是 Windows API 文档。它是 MFC,一个库,它的文档始终满足低于 Windows API 文档的标准。无论如何,人们希望 MFC 文档和示例代码也是正确的。如果我有任何希望,我会提交一份缺陷报告,即输入被合并。我还不够轻信,无法维持这种希望。
-
公平点,我可能有点天真地期望更好,多年来在 MFC 上玩了很多“乐趣和游戏”。
标签: c++ mfc cfiledialog