首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >STL容器和内存泄漏

STL容器和内存泄漏
EN

Stack Overflow用户
提问于 2012-08-31 03:56:02
回答 5查看 1.8K关注 0票数 1

C#程序员只是编写了这个简单的C++方法来从文件中获取文本:

代码语言:javascript
运行
复制
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)更广泛地说,按值返回对象容器是否会泄漏内存?(假设对象本身不会泄漏)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-31 03:59:36

代码语言:javascript
运行
复制
while (theFile.good()) {
 getline (theFile, line);
    lines.push_back(line);
}

忘了效率吧,这段代码是不正确的。它将无法正确读取文件。要了解的原因,请参阅以下主题

所以循环应该写成:

代码语言:javascript
运行
复制
while (getline (theFile, line)) {
    lines.push_back(line);
}

现在这是正确的。如果你想让它变得高效,首先分析你的应用程序。尝试查看占用CPU周期最多的部分。

(1)此代码是否会泄漏内存?

不是的。

(2)更普遍地说,按值返回对象容器会泄漏内存吗?

取决于容器中对象的类型。在您的示例中,std::vector中的对象类型为std::string,这确保不会泄漏内存。

票数 5
EN

Stack Overflow用户

发布于 2012-08-31 04:03:04

不是也不是。按值返回永远不会泄漏内存(假设容器和包含的对象写得很好)。如果有任何其他方式,它将是相当无用的。

我同意Nawaz所说的,你的while循环是错误的。坦率地说,令人难以置信的是,我们看到了多少次,肯定有很多糟糕的建议。

票数 1
EN

Stack Overflow用户

发布于 2012-08-31 04:06:00

(1)此代码是否会泄漏内存?

不是

(2)更普遍地说,按值返回对象容器会泄漏内存吗?

不是的。您可能会通过指针或通过泄漏的对象泄漏存储在容器中的内存。但这并不是由值返回引起的。

我知道这段代码效率不高;文本行在读取时复制一次,在按值返回时复制第二次。

很可能不是。该字符串有两个副本,但不是您想要的那个。返回的副本最有可能在C++03中进行优化,并将在C++11中进行优化或转换为移动(廉价)。

这两个copes相当于:

代码语言:javascript
运行
复制
getline (theFile, line);
lines.push_back(line);

第一行从文件复制到line,第二行从line复制到容器。如果您使用的是C++11编译器,则可以将第二行更改为:

代码语言:javascript
运行
复制
lines.push_back(std::move(line));

将字符串的内容移动到容器中。或者(在C++03中也有效),您可以使用以下命令更改这两行:

代码语言:javascript
运行
复制
lines.push_back(std::string()); // In most implementations this is *cheap*
                                // (i.e. no memory allocation)
getline(theFile, lines.back());

您应该测试读取的结果(如果读取失败,在最后一个备选方案中,请确保resize到一个较少的元素,以删除最后一个空字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12204488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档