【问题标题】:reallocating memory of a vector重新分配向量的内存
【发布时间】:2015-06-29 07:28:15
【问题描述】:

我正在使用vector<pair<int,int> > ar[100000]; 我必须将它用于几个测试用例,每次我希望它初始化但我遇到了分段错误。

我尝试在测试用例循环内部和全局范围内声明它。对于第一个测试用例或只有一个测试用例,它运行良好。

我也尝试在每个测试用例之后删除向量,但我不知道删除这种类型向量的确切语法,有什么帮助吗??

int main() {
    long long a, b, c, d = 0, i, j, n, m, t; 
    scanf("%lld", &t);
    while (t--) {
        scanf("%lld %lld", &n, &m);

        vector<pair<long long, long long> > ar[n + 9];
        for(i = 0; i < m; i++) {
            scanf("%lld %lld %lld",&a,&b,&c);
            ar[a - 1].push_back(make_pair(b - 1, c));
            ar[b - 1].push_back(make_pair(a - 1, c));
        }
        vector<long long> distance(10000, 100000000); 
        scanf("%lld", &a); 
        dijkstra(ar, a - 1, distance); 

        for (i = 0; i < n; i++) {
            if (i == a - 1)
                continue;
            if (distance[i] != 100000000)
                printf("%lld ", distance[i]);
            else {
                // printf("%lld\n", visited[i]);
                printf("-1 ");
            }
        }
        printf("\n");
        // ar.clear();
        distance.clear();
    }
    return 0;
}

【问题讨论】:

  • 你有一个 array 向量,也许你想要一个向量向量?
  • 如果您指出发生崩溃的在哪里,这也会有所帮助。您可以通过在调试器中运行程序的调试版本来做到这一点,并在发生崩溃时检查调用堆栈以查看 您的代码 中发生崩溃的位置。如果您可以将调用堆栈向上移动到您的代码并获取所涉及变量的值,例如例如用于向量的索引。
  • 顺便说一下,如果n100000(或附近)并且distance 向量的大小只有10000,你可以超出@987654327 的范围第二个for循环中的@向量。
  • m总是小于n+9吗? n 总是小于 10000 吗?为什么不用图中的节点数初始化距离?

标签: c++ vector stl dealloc


【解决方案1】:

vector&lt;pair&lt;long long,long long&gt; &gt; ar[n+9]; 在 C++ 中是非法的。 C 风格的数组维度必须在编译时知道。

如果您的编译器允许这样做,您必须使用编译器扩展,这可能会导致崩溃。例如,这可能会导致堆栈溢出,尽管我们远远超出了 C++ 标准所涵盖的范围。

不要使用 C 样式的数组,而是使用向量:

vector<vector<pair<long long,long long>>> ar(n+9);

那么它是合法的,如果你的内存用完了你会得到一个bad_alloc 异常抛出。 (为这种情况添加一个catch 处理程序可能很有用)。

您还应该在使用数组索引之前检查它们是否超出范围。例如:

scanf("%lld %lld %lld",&a,&b,&c);
if ( a < 1 || a > ar.size() || b < 1 || b > ar.size() )
   throw std::runtime_error("Edge out of bounds");

您还应该在进入for(i=0;i&lt;n;i++){ 循环之前检查n &lt; 10000,因为i 被用作distance 的索引。事实上,硬编码10000 在这里似乎很可疑。

或者,使用ar.at(a-1) 代替ar[a-1] 等也可以进行边界检查。

【讨论】:

  • 为什么标准委员会还没有 std::multi_array 对我来说仍然是个谜。向量的向量很笨重并且表现不佳(至少在 500x500 数组中分配了 500 个) - 您还必须调整每一行的大小。糟糕的!我希望我们能尽快得到一个。
  • 实际上我尝试使用 vector>> ar 但我不知道如何从中访问元素你能告诉我吗??
  • 我认为向量> ar[n+9];在 c++ 中不是非法的,因为它在没有测试用例为 1 时工作
  • 距离大小不是问题,因为我只有 n
  • @whishky 使用[ ] 访问元素,对于向量和对于 C 样式的数组是一样的。 vector&lt;pair&lt;long long,long long&gt; &gt; ar[n+9]; 确实是非法的,请参阅 C++ 标准中标题为 [dcl.array] 的部分。我不知道你所说的“它的工作”是什么意思,但如果它似乎工作那么它只是意味着你的编译器没有遵循 C++ 标准。我在答案的第二段中对此进行了解释。如果您坚持该标准所涵盖的内容,那么人们会更容易帮助您,因为它消除了猜测。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
相关资源
最近更新 更多