Visual C ++ 2013 std :: string内存泄漏

时间:2015-03-31 15:01:09

标签: c++ c++11 memory-leaks

在开发专有应用程序期间。我注意到内存泄漏,与MS Visual C ++ 2013 Update 4中的std :: string有关。

看一下导致内存泄漏的以下(基本)代码原型:

static std::string MemoryLeakTest()
{
    static size_t const test_size = 2002;
    std::unique_ptr<char[]> result1(new char[test_size]);
    std::string result2(result1.get(), test_size);
    return result2;
}

通过以下方式调用它:

std::string const testML = MemoryLeakTest();
std::cout << testML << std::endl;

我做错了什么,或者它是Visual C ++ STL中的内存泄漏?

P.S。这是DebugView输出,显示VLD检测到的内存泄漏:

[11140] WARNING: Visual Leak Detector detected memory leaks!
[11140] ---------- Block 3 at 0x00A95620: 2002 bytes ----------
[11140]   Leak Hash: 0x1DA884B6, Count: 1, Total 2002 bytes
[11140]   Call Stack (TID 9568):
[11140]     0x0FF5C260 (File and line number not available): MSVCR120D.dll!operator new
[11140]     f:\dd\vctools\crt\crtw32\stdcpp\newaop.cpp (6): TestCpp.exe!operator new[] + 0x9 bytes
[11140]     c:\work\testcpp\testcpp.cpp (307): TestCpp.exe!MemoryLeakTest + 0xA bytes
[11140]     c:\work\testcpp\testcpp.cpp (401): TestCpp.exe!wmain + 0x9 bytes
[11140]     f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c (623): TestCpp.exe!__tmainCRTStartup + 0x19 bytes
[11140]     f:\dd\vctools\crt\crtw32\dllstuff\crtexe.c (466): TestCpp.exe!wmainCRTStartup
[11140]     0x75557C04 (File and line number not available): KERNEL32.DLL!BaseThreadInitThunk + 0x24 bytes
[11140]     0x77C4B54F (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x8F bytes
[11140]     0x77C4B51A (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x5A bytes
[11140]   Data:

2 个答案:

答案 0 :(得分:0)

电话

std::unique_ptr<char[]> result1(new char[test_size]);

是对的。棘手的部分是不写std::unique_ptr<char>,它也会编译并导致内存泄漏(unique_ptr调用delete来释放资源。当用new[]初始化时,我们需要指示unique_ptr拨打正确的delete[])。

std::string构造函数调用也没问题,并且内存泄漏的可能性很小。可以用相同的方式从C风格的指针初始化std::string

我的代码段中没有发现内存泄漏。你怎么知道内存泄漏?

答案 1 :(得分:0)

使用Deleaker尝试使用代码,但无法发现任何泄漏。

然后尝试了这段代码:

while (true)
{
    std::string const testML = MemoryLeakTest();
    std::cout << testML << std::endl;
}

任务管理器显示内存使用情况保持不变:没有泄漏。

我认为这是VLD中的一个错误,你可以发现std :: unique_ptr确实释放了内存,只需在调试过程中进入,看看:

~unique_ptr() _NOEXCEPT
    {   // destroy the object
    _Delete();
    }

走得更远:

void _Delete()
    {   // delete the pointer
    if (this->_Myptr != pointer())
        this->get_deleter()(this->_Myptr);
    }
};

走得更远:

void operator()(_Ty *_Ptr) const _NOEXCEPT
    {   // delete a pointer
    static_assert(0 < sizeof (_Ty),
        "can't delete an incomplete type");
    delete[] _Ptr;
    }
};

啊哈,删除[]被叫!