我正在编写一个函数来加载一个 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/