【问题标题】:Why is my code giving me a memory error? c++为什么我的代码给我一个内存错误? C++
【发布时间】:2021-06-09 02:22:54
【问题描述】:

我正在尝试创建一个模拟项目购买菜单。如果有人能告诉我为什么我的向量返回 -858993460 而不是我试图通过数组读入的 int 值,我将不胜感激。我试图像数组一样读取它,它说我有内存问题。我被卡住了。

这是我声明的相关变量

string exit, storeChoice;
double balance = 10000;
bool store = true;
const int inv = 10;
unsigned int i = 0;
unsigned int Choice;
int iLimit[inv], categoryChoice;
vector<int> invVec;

这是发生错误的行和 Visual Studio 上的错误弹出窗口。 cout

以下代码在我的 main() 中

        if (categoryChoice == 1)
        {
            cin >> Choice;
            Choice >> iLimit[i];
            if (Choice != 0)
            {
                invVec.push_back(iLimit[i]);

                for (i = 0; inVec.size(); i++)
                {
                    cout << invVec.at(i) << endl; 
                }
            
                Choice = 0;
            }

【问题讨论】:

  • 在哪一行?调试器是否提供任何见解?
  • 确定 invVec 有9 个条目吗?这似乎是一个巨大的假设。我建议:for (auto&amp;&amp; item : invVec) { std::cout &lt;&lt; item &lt;&lt; std::endl; } 打印。
  • 欢迎来到 Stack Overflow。请查看我们的help section,特别注意minimal complete examples 上的页面。您没有给我们足够的代码来重现错误,而且您发布的大部分代码似乎与问题无关。
  • 您好,我将简化代码以更好地显示错误。我正在尝试将一个向量打印到控制台,其中包含我从一个数组中读取的数据,该数组读取来自用户的输入。之后我尝试了 cout
  • 最新的代码看起来非常错误。你确定你不是说 cout

标签: c++ arrays memory


【解决方案1】:
Choice >> iLimit[i];

这不是你想的那样,我想你的意思

iLimit[i] = Choice;

>> 运算符已为字符串类型(以及 cin、cout 等)重载,以将值从一个复制到另一个。但对于 int 情况并非如此,其中 >> 是位移运算符。它不会修改任何操作数,而是返回结果(您只是忽略),有点像这样做:

Choice + iLimit[i];

这意味着你的 iLimit 数组中没有放入任何内容,因此它只是充满垃圾(例如 -858993460 ),因此当你去时

invVec.at(iLimit[i])

你基本上在做

invVec.at(-858993460)

这显然不是向量的有效索引,因此是内存错误。

【讨论】:

  • 我刚刚使用您给我的代码修复了它。非常感谢!
  • 不客气!但是,您可能会发现有些人不会善意地看待这样的问题。我们解决了您的问题,您更新了很多问题。该网站的存在似乎主要是为了创建对其他人查看有用的问答。问问自己这个问题及其答案现在是否对其他人有所帮助?我不想阻止您提出问题,请注意以防此问题被删除或其他原因,这可能就是原因:)
  • 很高兴知道这一点。更新两次后我感觉很愚蠢,所以我要确保在下次第一次迭代时把问题弄对。在弄清楚为什么这段代码不起作用之前,我无法休息,即使问题很混乱,我也对我得到的响应量感到非常满意。我希望有人仍然觉得这很有用,我知道我确实做到了!干杯。
【解决方案2】:

我认为是因为

cout << invVec.at(iLimit[i]) << endl; // Trying to display inventory.. Memory 

iLimit[i] 返回您的项目 ID,而不是元素的索引

在您之前的代码中,您添加到 invVec

invVec.push_back(iLimit[i]);

但是当你使用 .at(n) 访问时,n 必须是索引而不是值

所以在你的情况下,你应该稍微改变你的循环以成为

for(i = 0;i < invVec.size();i ++) {
    cout << invVec.at(i) << endl; // Trying to display inventory.. Memory 

}

另外,将来包含控制台的一些输出也会很有帮助

【讨论】:

  • 最好在此处使用迭代器驱动的方法,除非明确需要索引,但至少这尊重size()
  • @tadman 我使用了你给我的下面的代码,它完美地解决了我的内存错误问题,即使它打印正确后仍然存在......我仍然想知道为什么/如何修复这部分它。 for (auto&& item : invVec) { cout
  • 您正在访问向量 超出范围 并因此而出错。该代码不能越界,它只会迭代存在的内容。当您假设一个向量有一定的大小时,这通常是错误的。即使最初是正确的,也可能随着时间的推移而改变,从而导致难以追踪错误。您想编写可以处理更改的代码,因此:迭代器。
  • @tadman 你真的很棒!格拉茨!!上周我们刚刚了解了向量和数组,我相信这在未来会派上用场。
猜你喜欢
  • 2016-09-18
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
  • 2014-01-09
相关资源
最近更新 更多