видя сбой приложения при попытке использовать strcpy

0

У нас есть cpp dll, где я мог сужаться до линии, откуда возникала авария. Строка связана с копией, которая:

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();
}

однако я все еще вижу отказ от сбоев. Не могли бы вы кого-нибудь предложить, что неправильно с моим исправлением.

  • 0
    Является ли output указывающий на выделенную память, достаточно большим, чтобы вместить все в sData ? И sData не строка широких символов?
  • 1
    О, и есть ли причина, по которой вы используете указатель в стиле C на строку вместо, например, CString (или std::string ) для аргумента? Так как функция в любом случае вызывается из кода C ++, вы также можете использовать правильные строковые классы.
Показать ещё 2 комментария
Теги:
dll

2 ответа

0

В этом коде может быть несколько проблем:

  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() );
  • 0
    из вызывающей функции есть строка free (output), которая вызывает сбой. Но моя новая проблема заключается в том, что вызываемая функция имеет определенные потоки, где мой метод вообще не вызывается, то есть нет malloc, я думаю, что это вызывает свободный сбой. Но как проверить, была ли выделена память или память?
  • 1
    Это приведет к сбою, потому что он не выделяет достаточно памяти для вывода.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню