HII我知道矢量分配的连续固定的内存时,它需要如果它不能够适应它,它会alllocate新的内存和旧的值复制到其中并删除旧内存的push_back一些items.And.如果是下面的代码是如何工作的情况下
#include<iostream>
#include<vector>
using namespace std;
class Test
{
public :
int val;
Test()
{
val=0;
}
};
int main()
{
vector<Test>vec;
Test t[10];
for (int i=0;i<5;i++)
vec.push_back(t[i]);
cout<<vec.capacity()<<endl; //printing 8
Test* obj=&vec[2];
obj->val=2;
cout<<obj<<endl;
for (int i=0;i<5;i++) //Adding 5 elements more
vec.push_back(t[i]);
Test* obk=&vec[2];
cout<<obk->val<<endl;
cout<<obj->val<<endl;
cout<<obj<<endl;
cout<<obk<<endl;
}
Run Code Online (Sandbox Code Playgroud)
在这里,如果你看到obj正在使用vec [2]的指针,我的机器中的值即将到来0x8bcb048.然后我又插入了5个项目,因此vector将分配新的内存.现在,如果我从向量[2]中获取obk它会变得不同地址0x8bcb070.但如果我试图在obj的帮助下接受我没有给出任何问题.任何理由?
但是,如果我试图在
obj它没有给出任何问题的帮助下访问它.任何原因?
这是不明确的行为 - 它似乎工作的事实仅仅是由于运气(无论运气好坏都是意见问题).
基本上你是解除引用'悬挂'指针.就像你取消引用一个已经被释放的内存块的指针一样,你只需读出看起来像是具有合理值的旧陈旧数据.或者你可能会读出看似垃圾的东西.或者您可能会导致段错误.
有一件事是肯定的 - 这是一个错误,无论它是否像一个人一样.