容器和析构函数处理问题

djh512 2012-06-07 10:27:37
DataPoint是一个类,类下面一个私有变量doube * dimension;
类的构造函数和析构函数如下

DataPoint::DataPoint(unsigned int dimNum):dimNum(dimNum)
{
this->dimension = new double[dimNum];
}

//构造函数
DataPoint::DataPoint(unsigned long dpID,double* dimension ,bool isKey, unsigned int dimNum):isKey(isKey), dpID(dpID), dimNum(dimNum)
{
this->dimension = new double[dimNum];
//传递每维的维度数据
for(unsigned int i=0; i<dimNum; i++)
{
this->dimension[i] = dimension[i];
}
}

DataPoint::~DataPoint()
{
if (this->dimension != NULL)
{
delete this->dimension;
this->dimension = NULL;
}
}


调用时候出问题的地方

vector<DataPoint> dadaSets;
while (! ifs.eof() ) //从文件中读取POI信息,将POI信息写入POI列表中
{
DataPoint tempDP(DIME_NUM); //临时数据点对象
double* tempDimData = new double[DIME_NUM]; //临时数据点维度信息
for(int j = 0; j < DIME_NUM; j++) //读文件,读取每一维数据
{
ifs >> tempDimData[j];
}
tempDP.SetDimension(tempDimData); //将维度信息存入数据点对象内
delete tempDimData;
tempDimData = NULL;

tempDP.SetDpId(i); //将数据点对象ID设置为i
tempDP.SetVisited(false); //数据点对象isVisited设置为false
tempDP.SetClusterId(-1); //设置默认簇ID为-1
dadaSets.push_back(tempDP); //将对象压入数据集合容器
i++; //计数+1
}

屏蔽析构函数程序就可以正常运行
在容器上处理析构函数还是有问题
不知道问题怎么解决
...全文
148 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
星星x 2012-06-07
  • 打赏
  • 举报
回复
根据楼主的描述感觉像是,深浅拷贝的问题,比如:char *p,*q; p=null;q = null; p = new char;
q = p; delete p; delete q;在回收q的时候就会报错,看楼主类里面有个指针成员,有指针成员感觉应该考虑这个问题。。。。。
j8daxue 2012-06-07
  • 打赏
  • 举报
回复
或者先push_back后,用back来初始化DataPaint的一些操作。这样就表示不用那个临时对象了
j8daxue 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
如果不改成vector能怎么有效避免这个问题么
[/Quote]
给你的DataPaint加引用计数,这样可以避免拷贝,赋值后直接删除。
djh512 2012-06-07
  • 打赏
  • 举报
回复
如果不改成vector能怎么有效避免这个问题么
djh512 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:
tempDP析构删了一次,vector释放数据也删了一次。
尽管这里的delete 不加[]没问题,但不是一个好习惯。

既然外面都用vecotr,那最好的解决办法是把DataPaint里的动态数组改成vecotr
[/Quote]
好主意
djh512 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

DataPoint::~DataPoint()
{
if (this->dimension != NULL)
{
delete [] this->dimension;
this->dimension = NULL;
}
}
是不是少了中括号?
[/Quote]
哦,忘了。是少了一个中括号。
j8daxue 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
tempDP析构删了一次,vector释放数据也删了一次。
尽管这里的delete 不加[]没问题,但不是一个好习惯。
[/Quote]
既然外面都用vecotr,那最好的解决办法是把DataPaint里的动态数组改成vecotr
j8daxue 2012-06-07
  • 打赏
  • 举报
回复
tempDP析构删了一次,vector释放数据也删了一次。
尽管这里的delete 不加[]没问题,但不是一个好习惯。
nickwu1220 2012-06-07
  • 打赏
  • 举报
回复
DataPoint::~DataPoint()
{
if (this->dimension != NULL)
{
delete [] this->dimension;
this->dimension = NULL;
}
}
是不是少了中括号?


64,651

社区成员

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

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