简体   繁体   中英

Memory leak when using smart pointers

Consider the following function:

unique_ptr<char> f(const wstring key, const unsigned int length)
{
    assert(length <= key.length());
    const wstring suffix = key.substr(length, key.length() - length);
    const size_t outputSize = suffix.length() + 1; // +1 for null terminator
    char * output = new char[outputSize];
    size_t charsConverted = 0;
    const wchar_t * outputWide = suffix.c_str();
    wcstombs_s(&charsConverted, output, outputSize, outputWide, suffix.length());
    return unique_ptr<char>(output);
}

The intent here is to accept a wstring, select length characters from the end, and return them as a C-style string that's wrapped in a unique_ptr (as required by another library - I certainly didn't chose that type :)).

One of my peers said in passing that he thinks this leaks memory, but he didn't have time to elaborate, and I don't see it. Can anybody spot it, and if so explain how I ought to fix it? I probably have my blinders on.

It's not necessarily a leak, but it is undefined behavior. You created the char array using new[] but the unique_ptr<char> will call delete , and not delete[] to free the memory. Use unique_ptr<char[]> instead.

Also, your conversion may not always behave the way you want it to. You should make 2 calls to wcstombs_s , in the first one pass nullptr as the second argument. This will return the number of characters required in the output string.

wcstombs_s(&charsConverted, nullptr, 0, outputWide, suffix.length());

Check the return value, and then use the result stored in charsConverted to allocate the output buffer.

auto output = std::unique_ptr<char[]>(new char[charsConverted]);
// now use output.get() to get access to the raw pointer

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM