我有一个解码base64字符串的函数,它返回一个unsigned char *指针。
unsigned char* Base64Decode(const StdString& a_strStdBase64, int& len);
我需要将返回的指针分配给unique_ptr,以使剩余的代码内存泄漏免于异常。
void doSomething()
{
unsigned char *sDecodedText = Base64Decode(...);
std::unique_ptr<unsigned char[]> upDecodedText(sDecodedText);
// Will use the decoded text here in other part implementations
}
这个编译很好,但是当upDecodedText超出范围时抛出异常。我知道unique_ptr只能释放由它分配的内存。从某种意义上说,如下所示
std::unique_ptr<unsigned char[]> upDecodedText(new unsigned char[10]);
我的方法是否使代码内存泄漏安全?欢迎提出修改意见
编辑:: Base64Decode实施
unsigned char*
Base64Decode(const StdString& a_strStdBase64, // Base64-encoded string
int& len, // resulting decoded buffer length
bool bUrlSafe) // URL safe
{
if (a_strStdBase64.empty())
{
return NULL;
}
int inDataLen = (int) len;
// Since Base64-encoded string is an ASCII string, do simple conversion.
const std::string strBase64(a_strStdBase64.begin(), a_strStdBase64.end());
const char* bufcoded = strBase64.c_str();
unsigned char* bufplain = new unsigned char[inDataLen];
if (NULL == bufplain)
{
return NULL;
}
//int base64Decode(int mode, const char* pInData, int nInDataLen, unsigned char* pOutData, int* pnOutDataLen)
if(base64Decode(BASE64_MODE_DEFAULT, bufcoded, inDataLen , bufplain, &len) != BASE64_SUCCESS)
{
delete [] bufplain;
return NULL;
}
return bufplain;
}
答案 0 :(得分:2)
在我看来,你的缓冲区正在溢出。注释表明len
应该是输出参数,产生结果数据的大小,但是您使用其输入值来调整数组的大小
结果:分配的缓冲区大小未知,可能为零,结果不合适,因此它们会覆盖存储在分配缓冲区附近的元数据,从而导致内存分配和释放函数的后续失败。
答案 1 :(得分:0)
使用unsigned char*
作为返回值可以在某些硬件fx上运行。核心i5,但你可能会遇到硬件fx问题。核心i7 - 所以我建议使用std::unique_ptr<unsigned char>
代替unsigned char*