2012-10-07 62 views
1

我有一个指针数组的载体vector<int> *F[12];,我想初始化一些载体及其地址存储在F.声明载体在for循环

for(uint i = A; i <= B; ++i){ 
    vector<uint> newvec(pow2(i), 0); 
    F[i] = &newvec; 
} 

但是当我尝试以后访问这些网站,我发现它们并非全部为零:

for(uint i = A; i <= B; ++i){ 
    for(uint j = 0; j <= pow2(i); ++j){ 
     if((*F[i]).at(j) != 0){ 
      cout << i << "/" << j << "/" << (*F[i]).at(j) << "|"; 
     } 
    } 
} 

我假设这与声明向量的范围有关。为什么记忆被释放了?我必须使用malloc并从中创建矢量吗?

+1

http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – chris

回答

2

newvec正在每次迭代调用堆栈上创建。每次通过循环创建它时,都会指向它,然后消失。你想使用'new'操作符在堆中创建一个持久化的向量实例。

+0

'vector * newvec = new vector (pow2(i), 0); F [i] = newvec;'似乎修复它,谢谢。 – Arcinde

+0

@ user49164:没有理由在这里动态分配向量。使用像'std :: vector'这样的容器的好处之一是它可以为你管理内存。当你动态分配它时,你现在必须释放它。最好只是将'vector&'作为函数的参数,并填充或返回'vector' –

2

newvec当循环退出时超出范围。任何现有的引用或指针都是无效的。你需要在合适的范围声明对象(我不知道在这种情况下是什么,但肯定在for循环之外)。