【问题标题】:C++ Vector + Array, vector have inexistent dataC++ Vector + Array,vector有不存在的数据
【发布时间】:2013-08-13 18:10:00
【问题描述】:

我正在开发一个程序,我有这段代码:

struct Point{
    int x, y, map;
}; // Portal Position

struct HPortal{
    Point startMap, targetMap;
    int MapTitle, PortalType;
}; // Portal Struct

std::vector<HPortal*> Portals[20001]; //Portal Array, total 20001 maps

但它会在“随机”操作中引发错误。

我用 VS 调试器看到数组有很多数据。我没有初始化它们(出于测试目的,我只在第一张地图中使用了一个门户)。

稍微搜了一下,觉得var太大了,程序不尊重数组的空间,覆盖掉了。

我该如何解决这个问题?

【问题讨论】:

  • HPortal 对象在哪里创建和销毁? (或者……您确定不想使用vector&lt;shared_ptr&lt;HPortal&gt;&gt;boost::ptr&lt;vector&lt;HPortal&gt;&gt; 或其他有助于管理门户生命周期的东西吗?)
  • 另外,您确定要将这个巨大的数组放在堆栈上(或在静态或全局中,或在任何地方)吗?例如,您是否可以在堆栈帧退出后使用一个或多个向量(例如,因为您通过引用在某处传递它们)?因为这正是引发“随机”错误的那种事情——可能需要相当长的时间才能覆盖价值 160K 的堆栈,因此崩溃可能比实际问题晚得多……
  • 最后,“var太大,程序不尊重数组的空间”在任何现代系统上都是不可能的(那种事情可以一些旧的 DOS 内存模型和类似的内存模型会发生,但我假设您正在处理 32 位或更多)。所以,问题出在你没有向我们展示的一些代码中。很可能这是我上面提到的事情之一,但还有各种其他可能性,包括完全不相关的代码会踩下堆栈或堆,所以如果没有SSCCE,我们就无法进一步调试它,或者至少更多你的代码。
  • @abarnert 你在第一条评论中是不是指的是boost::ptr_vector&lt;HPortal&gt;
  • @Kos:是的,抱歉打错了。

标签: c++ arrays vector


【解决方案1】:

您正在堆栈上创建一个包含 20001 个 std::vectors 的数组。你知道吗?你确定不想要吗

std::vector<HPortal*> Portals(20001); // holding x HPortal POINTERS

std::vector<HPortal> Portals(20001);; // holding x HPortals

在第一种情况下,堆栈上有一个 std::vector&lt;HPortal*&gt; 数组,这是一个非常有限的内存,尽管一个很小的测试样本显示它在堆栈上只需要大约 240kb 内存。但是,这可能仍然是一个问题,具体取决于堆栈的其余部分。如果你改用std::vector&lt; std::vector&lt;HPortal*&gt; &gt; Portals(20001);,你会在堆上创建相同数量的元素(它能够容纳更多的元素)。

您提供的代码无法检查您的代码的某些部分是否执行任意操作并覆盖程序/内存的其他部分。

【讨论】:

  • 是的,数组中的每个空间都是地图,向量包含地图的门户(例如:Portals[map][portal_num]->PortalType;)
  • 可以编辑HPortal结构并在门户中添加地图会增加“稳定性”吗?
  • 这实际上更像是一个评论而不是一个答案。
  • @ErniCA:稳定性问题无法通过您提供的部分解决。如果你使用指向结构的指针,你必须确定你在做什么,并且指针应该指向有效的结构。
【解决方案2】:

我解决了这个问题,删除了 [20001];现在,如果 Portal->startMap.map 与播放器相同,我会查看每个 var。而我看到我的 VS 用所有向量数组完成的“损坏”内存,我需要打印调试以获取信息:I

【讨论】:

  • 嗯,是的,用单个共享值替换数组将解决该数组的任何问题。但大概你有这个数组是有原因的,摆脱它会给你带来一系列全新的(更明显,但更难解决的)问题,所以我不确定这是一个怎样的答案。
猜你喜欢
  • 2017-01-10
  • 2011-05-24
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
相关资源
最近更新 更多