【问题标题】:seeing application crash when trying to use strcpy尝试使用 strcpy 时看到应用程序崩溃
【发布时间】: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或内存??

标签: c++ c dll


【解决方案1】:

该代码可能存在一些问题:

  1. 永远不要使用strcpy,因为它容易溢出目标缓冲区。在您的情况下,您知道要复制的字符串的长度,没有理由不使用memcpy,例如memcpy(output, p, strLen).
  2. 这是 C++ 代码,但缓冲区是使用 malloc 分配的。这段代码的调用者可能会不小心使用free[] 来释放它。您可能希望使用 std::vector<char> 代替原始指针。
  3. 您可以直接访问底层 C 字符串,而无需使用 CString::PCXSTR 复制它。

【讨论】:

    【解决方案2】:

    使用它来解决崩溃。

    output=(char *) malloc(sData.GetLength());
    strcpy(output,sData.GetString() );
    

    【讨论】:

    • 从调用函数中,有一行叫做free(output),它导致了崩溃。但是我的新问题是,被调用函数有某些流程,我的方法根本没有被调用,即没有 malloc,我认为这会导致 free 崩溃。但是如何检查是否分配了 malloc 或内存?
    • 这会崩溃,因为它没有为输出分配足够的内存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    相关资源
    最近更新 更多