怪事:delete [] sss;会报: DAMAGE:after Normal block(#84) at 0x00345350
代码主要是调用dll封装的一个加密解密函数。代码如下:
char * ss = " 11g中国 g ";
int len = strlen(ss);
char *sss = new char[len];
HINSTANCE dllinstance;
dllinstance=::LoadLibrary("E:\\EncryptDll\\Debug\\EncryptDll.dll");
if(dllinstance==NULL) AfxMessageBox("can't open dll file");
typedef void (FAR __stdcall *MYWENT)(char*,char*);
MYWENT proc;
proc=(MYWENT)GetProcAddress(dllinstance,"Encode");
if(proc==NULL) AfxMessageBox("can't find function");
else{
proc(ss,sss);
AfxMessageBox(sss);
}
delete [] sss;
::FreeLibrary(dllinstance);其中dll中的Encode函数如下:
char cryptokey[] = "qwertyuiop[]asdfghjkl;'zxcvbnm,.1234567890-=";
const int cryptokeylen = strlen(cryptokey);
void __stdcall Encode(char* usrkey,char* returnval)
{
int len = strlen(usrkey);
for (int i=0; i<len; i++)
{
returnval[i] = usrkey[i]^cryptokey[i%cryptokeylen];
}
returnval[i] = '\0';
} 错误就发生在: delete [] sss; 这一行.跟踪进去发现错误在这里:
if (!CheckBytes(pbData(pHead) + pHead->nDataSize, _bNoMansLandFill, nNoMansLandSize))
_RPT3(_CRT_ERROR, "DAMAGE: after %hs block (#%d) at 0x%08X.\n",
szBlockUseName[_BLOCK_TYPE(pHead->nBlockUse)],
pHead->lRequest,
(BYTE *) pbData(pHead));
代码主要是调用dll封装的一个加密解密函数。代码如下:
char * ss = " 11g中国 g ";
int len = strlen(ss);
char *sss = new char[len];
HINSTANCE dllinstance;
dllinstance=::LoadLibrary("E:\\EncryptDll\\Debug\\EncryptDll.dll");
if(dllinstance==NULL) AfxMessageBox("can't open dll file");
typedef void (FAR __stdcall *MYWENT)(char*,char*);
MYWENT proc;
proc=(MYWENT)GetProcAddress(dllinstance,"Encode");
if(proc==NULL) AfxMessageBox("can't find function");
else{
proc(ss,sss);
AfxMessageBox(sss);
}
delete [] sss;
::FreeLibrary(dllinstance);其中dll中的Encode函数如下:
char cryptokey[] = "qwertyuiop[]asdfghjkl;'zxcvbnm,.1234567890-=";
const int cryptokeylen = strlen(cryptokey);
void __stdcall Encode(char* usrkey,char* returnval)
{
int len = strlen(usrkey);
for (int i=0; i<len; i++)
{
returnval[i] = usrkey[i]^cryptokey[i%cryptokeylen];
}
returnval[i] = '\0';
} 错误就发生在: delete [] sss; 这一行.跟踪进去发现错误在这里:
if (!CheckBytes(pbData(pHead) + pHead->nDataSize, _bNoMansLandFill, nNoMansLandSize))
_RPT3(_CRT_ERROR, "DAMAGE: after %hs block (#%d) at 0x%08X.\n",
szBlockUseName[_BLOCK_TYPE(pHead->nBlockUse)],
pHead->lRequest,
(BYTE *) pbData(pHead));
returnval内存访问越界,外面申请的是空间是len个char,应该申请len + 1个,这样你才能设置: returnval[i] = '\0';
不然returnval[i] 不是你所申请的内存却修改了,所以当机了。
int len = strlen(ss);char *sss = new char[len];change to: char *sss = new char[len];