当我向vector <int * =“”>添加元素时,我遇到了一些问题

时间:2017-06-07 15:25:11

标签: c++

这是我的编码:

std::vector<int *>a;
for(i=0;i<3;i++)
{
  int j=i+1;
  int *p=&j;
  a.push_back(p);
}
for(auto &c:a)
{
  std::cout<<*c<<std::endl;  
}

我想让输出为1,2,3,但是输出是3,3,3。似乎我已经添加了相同的指针,但我想通过循环添加不同的指针,什么我该怎么做?上面的错误是怎么发生的?

2 个答案:

答案 0 :(得分:3)

j具有自动存储持续时间,并且指向它的指针仅在for循环的特定迭代中有效。

换句话说,您已经创建了一个悬空指针的向量!解除引用此类指针的行为是 undefined

请考虑使用std::vector<int>

(由于C ++运行时在同一内存位置重新创建j,因此在输出中重复看到相同值的事实可能是。但不要&#39; t 依赖于此.C ++标准并不坚持这种行为。)

答案 1 :(得分:1)

std::vector<int *>a;
for(i=0;i<3;i++)
{
  int j=i+1;
  int *p=&j;
  a.push_back(p);
}

p是堆栈中的地址。此外,jp仅在循环的相应迭代中有效,一旦循环进入下一次迭代或结束,它们就不再重要(j被破坏)

如果你真的想要一个指针向量,那么指针必须是有效的。一种选择是指针指向堆中的对象。另一种选择是指针指向堆栈中的对象,这些对象永远不会超出范围,即永远不会被破坏。

另一个,也许更好的选择是拥有对象本身的向量,例如, vector<int>

相关问题