原始指针赋值给std :: unique_ptr

时间:2014-08-25 18:30:04

标签: c++ pointers unique-ptr

我有一个解码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;
}

2 个答案:

答案 0 :(得分:2)

在我看来,你的缓冲区正在溢出。注释表明len应该是输出参数,产生结果数据的大小,但是您使用其输入值来调整数组的大小

结果:分配的缓冲区大小未知,可能为零,结果不合适,因此它们会覆盖存储在分配缓冲区附近的元数据,从而导致内存分配和释放函数的后续失败。

答案 1 :(得分:0)

使用unsigned char*作为返回值可以在某些硬件fx上运行。核心i5,但你可能会遇到硬件fx问题。核心i7 - 所以我建议使用std::unique_ptr<unsigned char>代替unsigned char*