string AesEncryptor::EncryptString(string strInfor) {
int nLength = strInfor.length();
int spaceLength = 16 - (nLength % 16);
unsigned char* pBuffer = new unsigned char[nLength + spaceLength];
memset(pBuffer, '\0', nLength + spaceLength);
memcpy_s(pBuffer, nLength + spaceLength, strInfor.c_str(), nLength);
m_pEncryptor->Cipher(pBuffer, nLength + spaceLength);
// 這里需要把得到的字符陣列轉換成十六進制字串
char* pOut = new char[2 * (nLength + spaceLength)];
memset(pOut, '\0', 2 * (nLength + spaceLength));
Byte2Hex(pBuffer, nLength + spaceLength, pOut);
string retValue(pOut);
delete[] pBuffer;
delete[] pOut;
return retValue;
}
在delete[] pOut時報錯,彈出對話框:Windows 已在 ***.exe 中觸發一個斷點。其原因可能是堆被損壞
uj5u.com熱心網友回復:
沒有專家來指導下嗎?uj5u.com熱心網友回復:
int nLength = strInfor.length();如果 長度不大 ,不要 new delete
char Out【4096】;
uj5u.com熱心網友回復:
個人覺得與string的“寫時拷貝”特性有關string retValue(pOut);
根據“寫時拷貝”特性,retValue和pOut指向同一塊記憶體,在程式結束時,string類的解構式已經釋放了這塊記憶體,然后再呼叫
delete[] pOut;
釋放這塊已經被釋放的記憶體,就會報錯!
uj5u.com熱心網友回復:
Byte2Hex 是怎么寫的? 估計有越界問題uj5u.com熱心網友回復:
你的轉換已經超出pOut所能承受的長度。你把pOut設定長點。或者誰寫的函式問下這個長度該定義多長合適。
記得給分。
uj5u.com熱心網友回復:
Byte2Hex(pBuffer, nLength + spaceLength, pOut); //這句可能轉換的時候越界了。你可以嘗試把這條注釋掉,然后看看還有沒有問題,如果有問題,就是這句出現的錯誤。
uj5u.com熱心網友回復:

要么用c方法。呼叫時傳遞buff和buffsize,如果保存的資料超過bufsize,就return 一個負的錯誤碼,如果資料足夠容納,那么return 1
要么string retValue(pOut); 改成
string retValue;
retValue=https://bbs.csdn.net/topics/pOut;
這就是內部淺拷貝和深拷貝那些事,不熟則避免
uj5u.com熱心網友回復:
貼代碼的時候,記得選一下C/C++的格式。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/85579.html
標籤:基礎類
上一篇:MapX 怎么記憶體繪圖
