首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

vector保存指针有关问题

2012-04-07 
vector保存指针问题structA{inti}int_tmain(intargc,_TCHAR*argv[]){A*pAnewA[10]//动态申请vector A

vector保存指针问题
struct   A
{
        int   i;
};

int   _tmain(int   argc,   _TCHAR*   argv[])
{  
                  A   *pA   =   new   A[10];       //动态申请
vector <A*>   vtr;
for(int   i=0;   i <10;   i++)
{
pA-> i   =   i;
vtr.push_back(pA);     //用vector保存指针
pA++;
}

vector <A*> ::iterator   first   =   vtr.begin();
vector <A*> ::iterator   last   =   vtr.end();
while   (first   !=   last)
{
delete   []   *first;     //能否这样释放
first++;     //调试时,该循环里会出错
}  
}


//以上代码运行出错


//我想知道能否用vector保存指针,然后释放这些指针指向的内存

谢谢


[解决办法]
vector可以保存指针
但是记住一点:容器内的元素,均为副本
[解决办法]
while (first != last)
{
delete [] *first; //能否这样释放
first++; //调试时,该循环里会出错
}
================
既然数组new的
一句delete[] *first;即可
[解决办法]
你那样,重复delete了多次,内存在第一次执行你那条语句的时候就全释放了
写成:
struct A
{
int i;
};

int _tmain(int argc, _TCHAR* argv[])
{
A *pA = new A[10]; //动态申请
vector <A*> vtr;
for(int i=0; i <10; i++)
{
pA-> i = i;
vtr.push_back(pA); //用vector保存指针
pA++;
}

vector <A*> ::iterator first = vtr.begin();
vector <A*> ::iterator last = vtr.end();
delete []*first;
return 0;
}
[解决办法]
A *pA = new A[10]; //动态申请
vector <A*> vtr;
for(int i=0; i <10; i++)
{
pA-> i = i;
vtr.push_back(pA); //用vector保存指针
pA++;
}
不太清楚你这段的目的 ,改成
for(int i=0; i <10; i++)
{
A *pA = new A[10];
pA-> i = i;
vtr.push_back(pA); //用vector保存指针
pA++;
}
会不会更合适点? :)
[解决办法]
vector如果想保存指针的话,请使用shared_ptr
[解决办法]
LZ还是参考taodm(taodm)所说的意见 用shared_ptr吧
[解决办法]
可以用vector保存指针,但是自己要记得处理这些指针,否则就最好使用智能指针(他们会自己处理自己的)。
[解决办法]
struct B
{
int j;
};

struct A
{
int i;
B *pB;
};

int _tmain(int argc, _TCHAR* argv[])
{

A *pA = new A[10000];
vector <A*> vtrA;
vector <B*> vtrB;

vtrA.push_back(pA);//vector 保存指针

for(int i=0; i <10000; i++)
{
pA-> i = i;
pA-> pB = new B[pA-> i];
vtrB.push_back(pA-> pB);//vector 保存指针

pA++;
}
vector <A*> ::iterator firstA = vtrA.begin();
delete []*firstA; //释放 //改为delete *firstA; ????才能保证正确释放

vector <B*> ::iterator firstB = vtrB.begin();
vector <B*> ::iterator lastB = vtrB.end();
while (firstB != lastB)
{
delete []*firstB; //释放 //改为delete *firstB; ????才能保证正确释放


firstB++;
}

system( "pause ");
}

我觉得这个写法已经正确释放了啊。
[解决办法]
//没有,我测试没有通过,这里应该不关迭代器的事。
然而,若把 delete []*Afirst 这句放到后面,就可以了

所以我理解的是,pA,PB之间存在引用关系,总应该先释放B,再释放A吧,
你直接先把A释放了,那么,其引用的B上的对象也应该被释放了??,或者就已经泄露了,
这时候再去释放B,这块内存这时候已经不归你管了,会随机报错。
所以我觉得是释放次序问题。楼下继续

[解决办法]
晕倒....这明显的错误哦.你一次申请了10个空间,一次一次加进vector,然后一次一次的删除....

热点排行