【问题标题】:CPP program consuming so much RamCPP程序消耗这么多内存
【发布时间】:2020-12-15 10:56:38
【问题描述】:

我的一个简单 CPP 文件占用了太多内存。有什么建议么?我使用 macbook air 2017 型号进行编码 代码是:

#include <iostream>
#include <vector>
using namespace std;

int main()
{

    std::vector<int> v;

    int x = 0, y, i;
    while (1) {
        cin >> x;
        if (x == 42) {
            break;
        }
        v.push_back(x);
    }

    for (auto it = v.begin(); it != v.end(); it++) {
        if (*it < 42) {
            cout << *it << endl;
        }
    }

    return 0;
}

Here's what I get inside the activity monitor

【问题讨论】:

  • ⟼通过采用indentation style 并一致地应用它,这段代码可以受益匪浅。缩进传达了结构和意图,使我们更容易理解您的代码,而无需花费大量时间来破译它,而且它还可以使错误更加明显,因为它们在视觉上很突出。
  • 这个读数是什么?该文件是否包含值42?你确定是这段代码导致了这个问题吗?这将继续无限制地分配内存,如果您输入一个没有值 42 的大文件,这可能会受到惩罚。
  • 您的代码有 5 个左大括号 {,但有 6 个右大括号 }。这真的是您构建程序的代码吗?它根本不应该编译。
  • 显然输入文件的内容无效,无法读取int 值。输入流处于错误状态,因此不会读取数据并且代码永远不会遇到值42。最终结果是吃掉所有内存的不定式循环。
  • 其他原因输入文件不包含值42,您到达文件末尾,流进入错误状态和....不定式循环。

标签: c++ macos ram


【解决方案1】:

显然输入文件的内容无效,您没有很好地处理错误。

场景 1
输入中包含无法读取为 int 的内容。

1 2 2.0 42 2

2.0 尝试读取int 时,wyo 将获得2 的值。在下一次迭代中尝试读取.0 将失败。 std::cin 设置为错误状态并忽略任何其他读取尝试。

场景 2
输入不包含终止值42

1 2 3 44 55 10

在这种情况下,您到达文件末尾 std::cin 设置为错误状态,并且忽略任何其他读取尝试。

在这两种情况下,x 永远不会设置为值42,并且您有不定式循环,它将最后一次成功读取的值插入为日志,有足够的内存。当内存被消耗时,程序以std::bad_alloc 异常终止。

要修复它,只需处理输入错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多