更改代码生成后以代码 255 退出的特定代码行
Posted
技术标签:
【中文标题】更改代码生成后以代码 255 退出的特定代码行【英文标题】:specific line of code exiting with code 255 after changing code generation 【发布时间】:2010-11-20 11:40:28 【问题描述】:好吧,我尝试编译一个我正在开发的小型测试应用程序。
所以为了保持简短:
当我将代码生成从“多线程 DLL”设置为“多线程”以摆脱一些依赖项时,以下代码行会导致我的应用程序崩溃(它通常在没有任何缺陷的情况下运行)
当我想将短路径转换为长路径时会发生崩溃。像这样:
LPCSTR tmp = reinterpret_cast<LPCSTR>(getenv("Temp"));
GetLongPathNameA(tmp,tempFolder,MAX_PATH);
崩溃具体发生在第一行:
LPCSTR tmp = reinterpret_cast<LPCSTR>(getenv("Temp"));
所以这里有什么想法为什么当您切换代码生成模式时它突然停止工作?谢谢!
编辑:
经过一些代码重写后,我设法发现它在执行时特别崩溃
getenv("Temp");
非常奇怪,因为它确实在其他模式下工作
【问题讨论】:
构建项目时是否有任何警告? 不,没有,它只是出于某种奇怪的原因以代码 255 退出 为什么需要reinterpret_cast
? getenv
的结果是char *
,它应该会自动转换为LPCSTR
(即const char *
)。如果你在没有演员阵容的情况下出现错误,它们可能值得关注。
【参考方案1】:
确保所有项目(以及这些项目的所有文件)始终设置为针对相同版本的运行时库进行编译和链接,即多线程静态,在您的情况下。如果混合使用这些选项,编译和链接的程序将具有未定义的行为。还要确保您针对正确版本的外部库(MFC 等)进行编译和链接。在某些情况下,您只能使用某些版本的运行时,例如如果你与.Net互操作,你必须使用multitheaded dll版本。
【讨论】:
【参考方案2】:你应该在访问前检查 getenv() 的返回值:
LPCSTR tmp = getenv("Temp");
if(tmp != NULL)
// do something with tmp
我的猜测是你的程序无法读取环境变量,访问生成的 NULL 指针会导致程序崩溃。
Microsoft 建议改用 getenv_s(),这是他们的 MSDN 示例,针对您的工作做了一些修改:
char *tmp;
size_t requiredSize;
getenv_s(&requiredSize, NULL, 0, "Temp");
tmp = (char *) malloc(requiredSize * sizeof(char));
if (tmp != NULL)
getenv_s(&requiredSize, tmp, requiredSize, "Temp");
if(tmp != NULL)
// do something with tmp
free(tmp);
我个人建议改用 WinAPI 函数 GetEnvironmentVariable(),这将为您提供更详细的错误消息(如果函数失败,请使用 GetLastError()),这可能会帮助您找到问题的根源(或修复使用这些替代方法之一)。
【讨论】:
【参考方案3】:尝试重建项目。清理它,确保输出文件夹中没有任何内容,最好也删除 .ncb,然后构建。
【讨论】:
【参考方案4】:在从动态运行时切换到静态后,您是否在链接器设置中指定了 libcmt.lib
和 libcpmt.lib
依赖项?如果没有,请尝试一下。然后进行重建。
【讨论】:
libcmt.lib 默认情况下已经链接,所以看起来。 libpcmt.lib 我设法手动链接,但它仍然崩溃【参考方案5】:您不应该使用 reinterpret_cast ,因为它是用于由其他类继承或继承自其他类的对象。只需将 static_cast 用于基本类型或指向基本类型的指针。
【讨论】:
你确定你没有想到dynamic_cast
? reinterpret_cast
与继承无关。以上是关于更改代码生成后以代码 255 退出的特定代码行的主要内容,如果未能解决你的问题,请参考以下文章