У нас есть 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();
}
однако я все еще вижу отказ от сбоев. Не могли бы вы кого-нибудь предложить, что неправильно с моим исправлением.
В этом коде может быть несколько проблем:
strcpy
поскольку он подвержен переполнению буфера назначения. В вашем случае вы знаете длину скопированной строки, нет причин не использовать memcpy
, например memcpy(output, p, strLen)
.malloc
. Вызывающий этот код может случайно использовать free[]
чтобы освободить его. Вы можете использовать std::vector<char>
вместо необработанного указателя.CString::PCXSTR
.Используйте это и решите сбой.
output=(char *) malloc(sData.GetLength());
strcpy(output,sData.GetString() );
output
указывающий на выделенную память, достаточно большим, чтобы вместить все вsData
? ИsData
не строка широких символов?CString
(илиstd::string
) для аргумента? Так как функция в любом случае вызывается из кода C ++, вы также можете использовать правильные строковые классы.