| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1421 人关注过本帖
标题:[经验]关于用delete删除new分配的内存
取消只看楼主 加入收藏
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
 问题点数:0 回复次数:4 
[经验]关于用delete删除new分配的内存

#include<iostream>
using namespace std;

class time{
public:
int second;
int min;
~time(){}
};

class Date{
public:
Date(int dd,int mm,int yy);
Date()
{
t = new time;
d = 1;
m = 1;
y = 2006;
t->min = 0;
t->second = 0;
t = NULL;
}

Date& add_year(int n){ y += n; return *this;}
Date& add_month(int n){ m += n; return *this;}
Date& add_day(int n) { d += n; return *this;}

~Date(){
delete t;
}

void display() const;
private:
/*mutable*/ int d,m,y;
static Date default_date;
time *t;

};

Date Date::default_date = Date();
inline Date::Date(int dd,int mm,int yy)
{

if(t==NULL) cout<<"yes"<<endl;
t = new time;
d = dd ? dd:default_date.d;
m = mm ? mm:default_date.m;
y = yy ? yy:default_date.y;
t->second = 12;
t->min = 32;
}

inline void Date::display() const
{
Date *ptod = const_cast<Date *>(this);
cout<<ptod->d+1 <<"/"<<ptod->m+1<<"/"<<ptod->y+1<<endl;
}

int main()
{
Date d(0,0,0);
d.display();
d.add_year(1).add_month(1).add_day(1);
d.display();
}

我想提醒大家的就是 time *t 已经在 Date Date::default_date = Date(); 中初始化(初试化时间是在进入main函数之前,也就是在定义Date的时候初始化的) 所以t不属于任何对象.
那么在定义了 对象d之后就调用Date(int dd,int mm,int yy),这个时候this指针是指向 对象d的,所以Date(int dd,int mm,int yy)里面的t是属于对象d的,那么如果企图想在Date(int dd,int mm,int yy)里面delete Date()里new分配的内寸单元就会出错
原因是t属于的对象不同,一个是属于无名对象,一个是属于d.


搜索更多相关主题的帖子: 内存 delete new 经验 删除 
2006-01-07 16:46
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
得分:0 
挖哈哈哈,这个问题如果不留意是很容易出错的

c++/C + 汇编 = 天下无敌
2006-01-08 09:53
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
得分:0 

楼上的:
你前两句说对了,后面那句有点问题。因为在Date(int dd,int mm,int yy)中进行第二次分配的时候
t已经改变了指向,也就是指向了新的内存地址,也就是说旧的静态对象分配的内存已经丢失了。
当退出程序的时候,1。首先进行对象d的析构,那个时候t就指向随意的内存地址。2,进行静态对象的析构,但是由于这个时候t已经指向了随意的内存地址,发生析构的时候就会发生灾难性后果。
大家可以试下,但是试过之后下次就要注意不要再犯这个错误。


c++/C + 汇编 = 天下无敌
2006-01-08 16:17
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
得分:0 

哦,是我自己糊涂了,不要意思~~~搞来搞去都是指针所属的对象不同.


c++/C + 汇编 = 天下无敌
2006-01-08 22:56
热情依然
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:22
帖 子:715
专家分:0
注 册:2005-4-5
收藏
得分:0 
对,所以在有指针成员的类一定要写上copy constructor 或者 重载 operator =运算符号,那就肯定不会再出现这些问题.还有在写上述函数的时候还要防止自复制
例如 if(this != &t) t是本类的对象.

c++/C + 汇编 = 天下无敌
2006-01-09 09:33
快速回复:[经验]关于用delete删除new分配的内存
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038629 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved