为什么cout.imbue(locale(“”))导致内存泄漏?

时间:2013-11-16 16:28:49

标签: c++ memory-leaks global-variables locale iostream

我的编译器是Visual VC ++ 2013.以下最简单的程序将导致一些内存泄漏。

为什么呢?如何解决?

#define _CRTDBG_MAP_ALLOC

#include <stdlib.h>
#include <crtdbg.h>
#include <cstdlib>
#include <iostream>
#include <locale>

using namespace std;

int main()
{
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);

    cout.imbue(locale("")); // If this statement is commented, then OK.
}

调试窗口输出如下:

Detected memory leaks!
Dumping objects ->
{387} normal block at 0x004FF8C8, 12 bytes long.
 Data: <z h - C N   > 7A 00 68 00 2D 00 43 00 4E 00 00 00 
{379} normal block at 0x004FF678, 12 bytes long.
 Data: <z h - C N   > 7A 00 68 00 2D 00 43 00 4E 00 00 00 
{352} normal block at 0x004FE6E8, 12 bytes long.
 Data: <z h - C N   > 7A 00 68 00 2D 00 43 00 4E 00 00 00 
{344} normal block at 0x004FE498, 12 bytes long.
 Data: <z h - C N   > 7A 00 68 00 2D 00 43 00 4E 00 00 00 
{318} normal block at 0x004FD5C8, 12 bytes long.
 Data: <z h - C N   > 7A 00 68 00 2D 00 43 00 4E 00 00 00 
{308} normal block at 0x004F8860, 12 bytes long.
 Data: <z h - C N   > 7A 00 68 00 2D 00 43 00 4E 00 00 00 
Object dump complete.
Detected memory leaks!
Dumping objects ->
{387} normal block at 0x004FF8C8, 12 bytes long.
 Data: <z h - C N   > 7A 00 68 00 2D 00 43 00 4E 00 00 00 
{379} normal block at 0x004FF678, 12 bytes long.
 Data: <z h - C N   > 7A 00 68 00 2D 00 43 00 4E 00 00 00 
{352} normal block at 0x004FE6E8, 12 bytes long.
 Data: <z h - C N   > 7A 00 68 00 2D 00 43 00 4E 00 00 00 
{344} normal block at 0x004FE498, 12 bytes long.
 Data: <z h - C N   > 7A 00 68 00 2D 00 43 00 4E 00 00 00 
{318} normal block at 0x004FD5C8, 12 bytes long.
 Data: <z h - C N   > 7A 00 68 00 2D 00 43 00 4E 00 00 00 
{308} normal block at 0x004F8860, 12 bytes long.
 Data: <z h - C N   > 7A 00 68 00 2D 00 43 00 4E 00 00 00 
Object dump complete.
The program '[0x5B44] cpptest.exe' has exited with code 0 (0x0).

1 个答案:

答案 0 :(得分:4)

我正在使用std::codecvt并遇到类似的问题。我不确定这是否是同一个原因。试着提供一种可能的方法来发现根本原因。

您可以参考http://www.cplusplus.com/reference/locale/codecvt/in/

中的示例

它实际上“使用”mylocale的成员,似乎没有r值参考版本重载。所以当直接写const facet_type& myfacet = std::use_facet<facet_type>(std::locale());时可能会导致同样的问题。

所以试试

auto myloc = locale("");
cout.imbue(myloc);