被push_back进vector的结构体指针合适可以被delete???
简单的代码如下。。。
typedef struct data
{
int a;
int b;
}MYDATA;
vector<MYDATA*> v_data;
int x,y;
for(i=0;i<100;i++)
{
MYDATA* pdata=new MYDATA;
pdata->a=i;
pdata->b=i+10;
v_data.push_back(pdata);
//delete pdata; <----------------------问题就出在这里
}
for(i=0;i<v_data.size();i++)
{
x=v_data[i]->a;
y=v_data[i]->b;
}
问题就出在delete那里,如果保留delete pdata,那么下面的x,y将无法被赋值。
如果注释掉delete,那么会不会造成内存泄漏?实际应用中,可能要push_back上万次。。。)
目前的想法是当v_data.size()达到某一设定值时,pop_back全部元素,并delete掉,请问这种思路是否可行?是否还留有隐患?
[解决办法]
当你的v_data不用了,然后你用一个for循环
for(int i=0;i!=v_data.size();++i)
{
delete v_data[i];
}
释放下就是了
[解决办法]
根据本人的经验:
v_data.push_back(pdata);
这句只是把指针pdata拷贝到 vector当中的一个指针p1当中 注意是拷贝
也就是说当前pdata和p1指向同一个东西,p1在vector中。
并不是将结构体放入vector,这点需要明确。
这时如果你delete pdata 也就是释放了 pdata 所指向的内存,即p1所指向的内存,
导致的结果是p1依然在vector中,但是已经成为野指针,当你再次访问的时候就会报错。
[解决办法]
容器里拷贝的是指针的副本,你把其指向的东西删了,他就悬空了。
是很邪恶,得看你怎么定义智能指针了,但是标准的auto_ptr这是被禁止的,标准的auto_ptr的赋值操作会破坏原对象(详见其实现),这样会使容器空空如也。这种行为叫做COAP已经被一些编译器禁止了。
[解决办法]
vector中存放指针,需要自己编码释放内存,可以在数据用完后遍历vector,delete每个指针
不想自己管理内存,vector直接存值好了