我具有以下功能(为简便起见,简称:):
(端口号= 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/

10-11 15:11