C#程序员只是编写了这个简单的C++方法来从文件中获取文本:
static std::vector<std::string> readTextFile(const std::string &filePath) {
std::string line;
std::vector<std::string> lines;
std::ifstream theFile(filePath.c_str());
while (theFile.good()) {
getline (theFile, line);
lines.push_back(line);
}
theFile.close();
return lines;
} 我知道这段代码效率不高;文本行在读取时复制一次,在按值返回时复制第二次。
两个问题:
(1)此代码是否会泄漏内存?(2)更广泛地说,按值返回对象容器是否会泄漏内存?(假设对象本身不会泄漏)
发布于 2012-08-31 03:59:36
while (theFile.good()) {
getline (theFile, line);
lines.push_back(line);
}忘了效率吧,这段代码是不正确的。它将无法正确读取文件。要了解的原因,请参阅以下主题
所以循环应该写成:
while (getline (theFile, line)) {
lines.push_back(line);
}现在这是正确的。如果你想让它变得高效,首先分析你的应用程序。尝试查看占用CPU周期最多的部分。
(1)此代码是否会泄漏内存?
不是的。
(2)更普遍地说,按值返回对象容器会泄漏内存吗?
取决于容器中对象的类型。在您的示例中,std::vector中的对象类型为std::string,这确保不会泄漏内存。
发布于 2012-08-31 04:03:04
不是也不是。按值返回永远不会泄漏内存(假设容器和包含的对象写得很好)。如果有任何其他方式,它将是相当无用的。
我同意Nawaz所说的,你的while循环是错误的。坦率地说,令人难以置信的是,我们看到了多少次,肯定有很多糟糕的建议。
发布于 2012-08-31 04:06:00
(1)此代码是否会泄漏内存?
不是
(2)更普遍地说,按值返回对象容器会泄漏内存吗?
不是的。您可能会通过指针或通过泄漏的对象泄漏存储在容器中的内存。但这并不是由值返回引起的。
我知道这段代码效率不高;文本行在读取时复制一次,在按值返回时复制第二次。
很可能不是。该字符串有两个副本,但不是您想要的那个。返回的副本最有可能在C++03中进行优化,并将在C++11中进行优化或转换为移动(廉价)。
这两个copes相当于:
getline (theFile, line);
lines.push_back(line);第一行从文件复制到line,第二行从line复制到容器。如果您使用的是C++11编译器,则可以将第二行更改为:
lines.push_back(std::move(line));将字符串的内容移动到容器中。或者(在C++03中也有效),您可以使用以下命令更改这两行:
lines.push_back(std::string()); // In most implementations this is *cheap*
// (i.e. no memory allocation)
getline(theFile, lines.back());您应该测试读取的结果(如果读取失败,在最后一个备选方案中,请确保resize到一个较少的元素,以删除最后一个空字符串。
https://stackoverflow.com/questions/12204488
复制相似问题