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

laf*_*erc 3 c++ string memory-leaks memory-management 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;
}
Run Code Online (Sandbox Code Playgroud)

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

static const char* pVS;
...
pVS = loadFile("VS.txt");
...
delete pVS;
Run Code Online (Sandbox Code Playgroud)

这会删除字符串吗?

Lih*_*ihO 6

"这会删除字符串吗?"

不会.它会尝试删除std::string底层字符存储,从而产生不确定的行为.
即使它成功地释放了存储空间,也有其他std::string成员无法处理,所以是的,除了未定义的行为之外,还存在内存泄漏.

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


为了避免内存泄漏:
  • 在可能的情况下始终避免动态分配
  • 当它不可能而且您必须使用new或时new[],请确保:
    • 每一个new都有适当的delete电话和
    • 因为每个人new[]都有适当的delete[]电话.

    (请注意,这可能比看起来更难......尤其是当您处理容易出错的代码而您仍然需要处理所有可能的返回路径时〜这是为什么总是优先使用它的主要原因之一RAII和C++中的智能指针)