代码之家  ›  专栏  ›  技术社区  ›  monksy

如果没有正确删除,为什么wstring::c\u str不会导致内存泄漏

  •  5
  • monksy  · 技术社区  · 14 年前

    wchar_t *aString() 
    {
         wchar_t *str = new wchar[5];
         wcscpy(str, "asdf\0");
         return str;
    }
    wchar_t *value1 = aString();
    

    wstring wstr = L"a value";
    wchar_t *value = wstr.c_str();
    

    如果代码段2的值未被删除,则不会发生内存泄漏。但是,如果代码段1中的值1未被删除,则存在内存泄漏。wstring::c\u str的内部代码在我看来是一样的。

    4 回复  |  直到 14 年前
        1
  •  11
  •   Daniel Trebbien    13 年前

    一条重要的规则:你必须使用 delete 任何由 new ,并且不能删除任何其他内容。

    wstr.c_str() 返回指向由管理的缓冲区的指针 wstring 在这个问题上是错误的。如果修改字符串,指针也将失效。

    aString() new[] ,因此必须在完成后将其删除(使用 delete[] ,以匹配 ). 这很容易出错,这就是为什么使用资源管理类(如 string 垫圈 ,容器和智能指针),而不是传递原始指针并希望它们得到正确处理。

        2
  •  2
  •   Didier Trosset    14 年前

    因为 c_str() 返回指向的内部表示形式的指针 wstring

        3
  •  2
  •   Frank Bollack    14 年前

    取自 basic_string::c_str() documentation from MSDN

    返回的C样式字符串不应 是 指向字符串的指针,或 因为字符串的寿命有限 属于类字符串 .

        4
  •  1
  •   Shawn D.    14 年前

    我要说的是wstring不是wchar\u t,而是一个类,它有一个操作符返回wchar\u t*,所以在wstring的析构函数中,它可能会释放它自己返回的wchar\u t*的副本。