重新分配向量的记忆

时间:2015-06-29 07:28:16

标签: c++ vector stl dealloc

我正在使用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;
}

1 个答案:

答案 0 :(得分:2)

vector<pair<long long,long long> > 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");

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

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