【发布时间】:2014-08-27 05:32:22
【问题描述】:
我们有 cpp dll,我可以在其中缩小到发生崩溃的行。该行与copy有关,即:
void GetCellText(HWND ssHwnd,char *& output){
CString sData;
....
....
strcpy (output, sData) //app crashes here
}
所以我像这样替换了 strcpy:
void copyToOutput(char *& output, CString sData) {
int strLen = sData.GetLength();
output = (char *) malloc(sizeof(char) * strLen + 1); // Allocate memory
LPTSTR p = sData.GetBuffer(strLen);
strcpy(output, p);
output[strLen] = '\0'; // Null terminate
sData.ReleaseBuffer();
}
但是我仍然看到崩溃失败。谁能建议我的修复有什么不正确的地方。
【问题讨论】:
-
output是否指向分配的内存,大到足以容纳sData中的所有内存?而sData不是宽字符串? -
哦,你使用 C 风格的字符串指针而不是例如
CString(或std::string)的论点?由于该函数是从 C++ 代码调用的,因此您不妨使用适当的字符串类。 -
崩溃的堆栈跟踪将比我们在这里猜测的任何代码都提供更多信息。无关:通过引用您的函数传递
sData;制作比你必须做的更多的副本是没有意义的。我的猜测:你在其他地方破坏了你的堆。 -
正确,从调用函数中,有一行叫做free(output),它导致了崩溃。但是我的新问题是,被调用函数有某些流程,我的方法根本没有被调用,即没有 malloc,我认为这会导致 free 崩溃。但是如何检查是否分配了malloc或内存??