这个delete操作错在哪?(应该不难)

南京短暂的春天 2009-05-01 09:36:51
t_point是一个类
vector <t_point> data;
for(int j=0;i <8;i++)
{
t_point *pi=new t_point(XX,XX,XX);
data.push_back(*pi);
}
之前用这样的方式操作了8次

现在在释放内存。

for(int i=(BST->data.size())-1;i>=0;i--)
{
delete &(BST->data[i]);
}
编译不报错。运行到delete &(BST->data[i]); 就出问题了。

我把释放内存的代码换成下面


vector <t_point>::iterator ite;
for(ite=data.begin();ite!=data.end();++ite)
delete ite;

delete操作只能在for循环里执行一次。第二次就出错了。
...全文
231 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
soft_ruan 2009-05-02
  • 打赏
  • 举报
回复
很有可能你的程序用了多台造成的!
youzhipeng 2009-05-02
  • 打赏
  • 举报
回复
[code=C/C++]
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int gCreateTimes = 0;
int gDeleteTimes = 0;
int gCopyTimes = 0;
class CPoint
{
public:
CPoint(){cout<<"D"<<endl;gCreateTimes++; }
CPoint(const CPoint& Copy)
{
gCopyTimes ++;
}
~CPoint(){cout<<"A"<<endl;gDeleteTimes++; }
};

int main()
{
vector<CPoint> vec;
for(int i=0;i<5;i++)
{
CPoint *pPoint = new CPoint;
vec.push_back(*pPoint);
delete pPoint;
}
cout<<"Create"<<gCreateTimes<<endl;
cout<<"Delete"<<gDeleteTimes<<endl;
cout<<"Copy"<<gCopyTimes<<endl;
system("pause");
return 0;
}[code]

*****************************************运行结果**************************************
Create 5
Delete 20
Copy 20
**************************************************************************************

我的分析:
CPoint *pPoint = new CPoint; 肯定调用了五次构造函数。
delete pPoint; 肯定五次析构。

vec.push_back(*pPoint); 这里面就有大文章了, 我觉得就 五次拷贝构造函数+五次析构函数。 但是~~~~~~~


谁能详细帮忙分析下!多谢。
doudouHuY 2009-05-02
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 ToBeTough 的回复:]
up
[/Quote]
vec.push_back(*pPoint); 里头有copy和fill操作会引起拷贝构造函数的多次调用,具体的你跟刀stl代码里头就知道了
ToBeTough 2009-05-02
  • 打赏
  • 举报
回复
up
nicky_zs 2009-05-02
  • 打赏
  • 举报
回复
楼主要搞清楚一个概念。
虽然你最开始是在一个for循环里面不断地new了很多对象,但是你把它push_back到vector中的时候,始终都只是在vector里面保存了一个新的副本而已,而vector中的副本是不需要你去关心如何delete的。你要delete的应该是你在new和push_back之后,把那个new的东西给delete掉。
jackzhhuang 2009-05-02
  • 打赏
  • 举报
回复
delete迭代器居然能通过编译?!但可以肯定这是错的。

楼主似乎还没有理解迭代器。

迭代器是容器类型的一个代理,*iter才是你放入容器的对象。
windsting 2009-05-01
  • 打赏
  • 举报
回复

//t_point是一个类
vector <t_point> data;
for(int j=0;i <8;i++)
{
t_point *pi=new t_point(XX,XX,XX);
data.push_back(*pi); //这里神了,你push_back进入vector的是你new出来的对象的副本,
//这个循环丢掉了8*sizeof(t_point)个字节的内存
}
//之前用这样的方式操作了8次

//现在在释放内存。

for(int i=(BST->data.size())-1;i>=0;i--)
{
//这里更强,如果这个data还是上面的data的话,你就在企图delete由vector
//分配的内存,而vector很可能根本就并不是使用你的这个分配内存的机制
//(vector自己应该有管理内存的机制)
//但是因为你给delete的东西确实是一个可以进行操作的指针,编译器当然让它通过
delete &(BST->data[i]);
}

vector <t_point>::iterator ite;
for(ite=data.begin();ite!=data.end();++ite)
delete ite; //这里强到无以复加了,ite是一个vector<t_point>::iterator类型,
//对它进行delete应该是什么结果呢??
//如果data里面存储的是指针,你也该写"delete *ite"
//ite指向的对象才是可以被delete的东西啊。


解释完了,但愿你满意,同时请你把基本概念在认真看看,真的。
lpf000 2009-05-01
  • 打赏
  • 举报
回复
UP
pengzhixi 2009-05-01
  • 打赏
  • 举报
回复
我的帖子 给分 结贴
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 pengzhixi 的回复:]
for(int j=0;i <8;i++)
{
t_point *pi=new t_point(XX,XX,XX);
data.push_back(*pi);
delete pi;//直接加到这就 OK了。因为data里面存放的 是副本
}
[/Quote]

我刚写了个测试程序,确实是个副本。之前是我理解错误。不好意思了。太丢人了。现在完全懂了。

分是怎么给的啊?
mabo321 2009-05-01
  • 打赏
  • 举报
回复

vector <t_point> data;
for(int j=0;i <8;i++)
{
t_point pi=t_point(XX,XX,XX); // 为什么非得new ?
data.push_back(pi); // vector 中有默认的 alloc
}

pengzhixi 2009-05-01
  • 打赏
  • 举报
回复
for(int j=0;i <8;i++)
{
t_point *pi=new t_point(XX,XX,XX);
data.push_back(*pi);
delete pi;//直接加到这就 OK了。因为data里面存放的 是副本
}
lingyin55 2009-05-01
  • 打赏
  • 举报
回复
应该不会的,push_back(*pi); 之后已经把数据保存到容器里了,
这时delete的只是动态申请的那个空间。



[Quote=引用 4 楼 dcmilan 的回复:]
引用 2 楼 goodname 的回复:
你的vector里面存放的是对象而不是指针,所以无需delete

程序可以简化一下

for(int j=0;i <8;i++)
{
data.push_back(t_point(XX,XX,XX));
}
对于你的原程序,应该push_back后,应该delete pi;,我认为

push_back后,delete pi

那我存在data里的数据是不是也没了?
[/Quote]
qqwx_1986 2009-05-01
  • 打赏
  • 举报
回复
不会没有,push_back会把你的数据拷贝进去了
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qqwx_1986 的回复:]
C/C++ code
vector <t_point*> data;
for(int j=0;i <8;i++)
{
t_point *pi=new t_point(XX,XX,XX);
data.push_back(pi);
}
...
for(int i=(BST->data.size())-1;i>=0;i--)
{
delete (BST->data[i]);
}



你觉得你vector里面存的是个什么东西
[/Quote]

存的是一些类的对象,不是指针。对delete的操作真的不熟悉。以前做东西几乎没用过。
goodname 2009-05-01
  • 打赏
  • 举报
回复
data里面存放的是拷贝,是由vector自己维护的。

比如

void f(vector<int> &v)
{
int a=0;
v.push_back(a);
}
这样,v只是存放的a的一个拷贝的值,是个复制品,当函数执行完毕后,你是否认为a是个局部变量
而导致v中存放的是无效的值啊?
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 goodname 的回复:]
你的vector里面存放的是对象而不是指针,所以无需delete

程序可以简化一下

for(int j=0;i <8;i++)
{
data.push_back(t_point(XX,XX,XX));
}
对于你的原程序,应该push_back后,应该delete pi;,我认为
[/Quote]
push_back后,delete pi

那我存在data里的数据是不是也没了?
qqwx_1986 2009-05-01
  • 打赏
  • 举报
回复

vector <t_point*> data;
for(int j=0;i <8;i++)
{
t_point *pi=new t_point(XX,XX,XX);
data.push_back(pi);
}
...
for(int i=(BST->data.size())-1;i>=0;i--)
{
delete (BST->data[i]);
}

你觉得你vector里面存的是个什么东西
goodname 2009-05-01
  • 打赏
  • 举报
回复
你的vector里面存放的是对象而不是指针,所以无需delete

程序可以简化一下

for(int j=0;i <8;i++)
{
data.push_back(t_point(XX,XX,XX));
}
对于你的原程序,应该push_back后,应该delete pi;,我认为
mengde007 2009-05-01
  • 打赏
  • 举报
回复
貌似不能这样吧;
vector <t_point>::iterator ite,temp;
for(ite=data.begin();ite!=data.end();++ite)
{
temp=ite;
delete temp;
}

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧