c++ - 使用 c_str() 返回的指针删除动态分配的 std::string 是否会导致 C++ 中的内存泄漏?

标签 c++ string memory-management memory-leaks return-value

我正在编写一个函数来加载一个 txt 文件并返回一个 const char* 下面的函数有效,我的问题是如果我不存储 *pS 然后调用 delete pS 这个函数会导致内存泄漏吗?

const char* loadFile(string fname)
{
   string line,text;
   ifstream in(fname);
   while(std::getline(in, line))
   {
       text += line + "\n";
   }

   string *pS = new string(text);
   const char* data = pS->c_str();

   return data;
}

函数在我的代码中使用如下

static const char* pVS;
...
pVS = loadFile("VS.txt");
...
delete pVS;

这会删除字符串吗?

最佳答案

“这会删除字符串吗?”

否。它将尝试删除 std::string的底层字符存储产生未定义的行为
即使它成功释放了该存储,还有其他 std::string它不会处理的成员,所以是的,除了未定义的行为,还有内存泄漏

解决方案:将您的函数更改为返回 std::string对象代替。或者你可能会返回 std::vector<std::string>包含行,这似乎比添加 "\n" 更合理.


为了避免内存泄漏:
  • 尽可能避免动态分配
  • 当不可能并且您必须使用new 时或 new[] ,然后确保:
    • 对于每个 new有一个合适的delete调用
    • 对于每个 new[]有一个合适的delete[]打电话。

    (请注意,这可能比看起来更难......尤其是当您处理容易出错的代码时,您仍然需要处理每条可能的返回路径〜这是它总是如此的主要原因之一最好使用 RAII and smart pointers in C++ )

关于c++ - 使用 c_str() 返回的指针删除动态分配的 std::string 是否会导致 C++ 中的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19318521/

相关文章:

iphone - 内存泄漏与高内存分配?

C++ new 运算符分配新内存

C++ 正确释放具有底层连续内存的多维数组

c++ - 我可以强制可变参数模板采用特定类型的参数吗

c++ - 用C++中的字符串替换空格

c - C 中的 NULL 值和 "0"字符串?

java - parseFloat() 与 parseDouble()

c++ - 是 Foo* f = new Foo 好的 C++ 代码吗

c++ - C++ 中的除法汇总

c++ - 我的 IF 语句中的问题,Else 无法正常工作