【发布时间】:2012-08-30 19:56:02
【问题描述】:
C# coder 刚刚编写了这个简单的 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) 更一般地说,按值返回对象容器是否会泄漏内存? (假设对象本身不泄漏)
【问题讨论】:
-
你可能不希望
static像在 C# 中那样无处不在。此外,容器会在它们被销毁时释放内存,当它们像你一样在堆栈上分配时,就是它们超出范围时。 -
实际上按值返回并不一定会导致副本。由于RVO,它可以避免,或者,如果使用 c++11 并且 RVO 是不可能的,则返回值被移动而不是被复制(移动
vector大约需要三个指针分配,所以这并不是真的花费很多)。不,如果对象本身是正确的,按值返回对象不会泄漏内存。在 c++ 中,除非您开始使用new -
更好:
while (std::getline(theFile, line)),否则你会在 eof 处得到一个额外的空行。除此之外,代码很好。在 C++11 中,您有惯用的方法来避免额外的副本。在 C++03 中,您通常更喜欢额外的副本而不是卷积代码。