在下面的代码中,如果我注释掉对“ GetCurrentDirectory”的调用,则一切正常,但是,如果我不这样做,则代码在此之后中断,没有子窗口出现,但程序不会崩溃。编译器没有给出任何错误。
char *iniFilePath;
int lenWritten = GetCurrentDirectory( MAX_PATH, iniFilePath );
if( lenWritten )
{
lstrcat( iniFilePath, iniFileName.c_str() );
char *buffer;
GetPrivateProfileString( iniServerSectionName.c_str(), serverIp.c_str(), "", buffer, MAX_PATH, iniFilePath );// server ip
MessageBox( 0, buffer, 0, 0 );
}
else
{
MessageBox( 0,0,0,0 );
}
最佳答案
iniFilePath
是GetCurrentDirectory()
试图写入的未初始化指针,导致未定义的行为。 GetCurrentDirectory()
不会为调用方分配缓冲区:必须提供它。
改成:
char iniFilePath[MAX_PATH]; // or similar.
代替使用
lstrcat()
(在其参考页上显示警告不要使用消息),而是使用std::string
构造路径,以避免潜在的缓冲区溢出:const std::string full_file_path(std::string(iniFilePath) + "/" + iniFileName);
注意Wimmel指出的与
buffer
类似的问题。关于c++ - GetCurrentDirectory()破坏了C++中的代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13668447/