VS2022中std::string.c_str()触发悬垂指针警告,是否为真问题?
问题分析:悬垂指针警告是真实问题,并非误报
你的代码确实存在悬垂指针风险,VS的警告C26815不是误报,核心原因如下:
getProgramUUID()返回的是一个临时std::string对象,它的生命周期仅局限于包含它的完整表达式。你代码中第一行chars = (unsigned char*)(pProgram->getProgramUUID().c_str());是一个独立的完整表达式,执行完毕后这个临时std::string会立即被销毁。c_str()返回的指针指向临时std::string内部的字符数组,临时对象销毁后,该指针就变成了悬垂指针。第二行memcpy使用这个指针时,访问的是已经被释放的内存,属于未定义行为(可能导致崩溃、数据错乱等问题)。
修复方案
方案一:保存临时对象到局部变量
将返回的std::string保存到局部变量,延长其生命周期至memcpy执行完成:
std::string programUUID = pProgram->getProgramUUID(); // 注意c_str()返回const char*,需先const_cast再转unsigned char* unsigned char* chars = reinterpret_cast<unsigned char*>(const_cast<char*>(programUUID.c_str())); memcpy(&outputBuffer[bufferPosition], chars, numChars);
方案二:直接在memcpy中使用临时对象的c_str()
将临时对象的c_str()直接作为memcpy的参数,此时临时对象的生命周期会延长至memcpy函数调用结束:
memcpy( &outputBuffer[bufferPosition], reinterpret_cast<const unsigned char*>(pProgram->getProgramUUID().c_str()), numChars );
内容的提问来源于stack exchange,提问作者Abhishek Mishra
相关产品推荐
相关产品推荐

