我具有以下功能(为简便起见,简称:):
(端口号= 12345)
void startparser(){
std::ostringstream convert;
convert.str("");
convert << '"' << "c:\\some\\file path\\a_program.exe" << '"' << " " << PortNo;
std::cout << "DEBUG2 " << convert.str() <<std::endl;
char *cmd = const_cast<char*> ( convert.str().c_str() );
std::cout << "DEBUG3 " << cmd <<std::endl;
}
我用Eclipse MinGW64和代码输出在w10 64bit上编译
DEBUG2“ c:\ some \ file path \ a_program.exe” 12345
DEBUG3“ c:\ some \ file path \ a_program.exe” 12345
现在,如果我将二进制文件和3个dll复制到Win7 64计算机上并运行相同的代码,
DEBUG2“ c:\ some \ file path \ a_program.exe” 12345
调试3。
我不明白吗?我需要cmd才能成为LPTSTR。有人可以澄清一下吗?获得我的LPTSTR的另一种方法也很好。
最佳答案
您正在使用一个临时对象:ostringstream::str()
返回一个立即被销毁的对象。因此,在此行之后
char *cmd = const_cast<char*> ( convert.str().c_str() );
cmd
指向用于临时对象的内存,因此不再有效。如果确实需要使用
const char*
进行操作,则需要创建一个中间string tmp = convert.str()
。这样,指向tmp.c_str()
的指针将在tmp
的整个范围内有效。关于c++ - C++ const_cast <char *>在2个64位MS OS上的相同二进制结果不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35200944/