Person::~Person()
{
//delete birthDate;
}
不要自己定义析构函数
如果数据成员有new分配的,因为析构函数里面有delete,如果是默认构造函数,那就是浅复制了,那最后2个类对象调用析构函数的时候,同一个内存会释放2次,然后出错啊。
但是默认的析构函数析构就是正确的。。
---------------------------------------
目前解决问题
------------------------------------
我先看看有没有内存泄露。。。一会再答。。。
------------------------
查看了一下,有内存泄露
------------------
如果一个类中有指针成员,使用缺省的复制构造函数初始化对象就会出现问题。
--------------------------------------------
把析构函数删了会有内存泄露。。。。。
------------------------------------
修改如下:
//Date.h
#ifndef DATE_H
#define DATE_H
class Date
{
public:
Date(int,int,int);
int getYear() const;
void setYear(int);
int getMonth() const;
void setMonth(int);
int getDay() const;
void setDay(int);
private:
int year;
int month;
int day;
};
#endif
----------------------
//Date.cpp
#include"Date.h"
Date::Date(int newYear,int newMonth,int newDay)
{
year = newYear;
month = newMonth;
day = newDay;
}
int Date::getYear() const
{
return year;
}
void Date::setYear(int newYear)
{
year = newYear;
}
int Date::getMonth() const
{
return month;
}
void Date::setMonth(int newMonth)
{
this->month = newMonth;
}
int Date::getDay() const
{
return day;
}
void Date::setDay(int newDay)
{
this->day = newDay;
}
-----------------------
//Person.h
#include"Date.h"
class Person
{
public:
Person(int,int,int,int);
~Person();
int getId();
Date* getBirthDate() const;
Person(const Person &rhs);
Person& operator=(const Person& rhs);
private:
int id;
Date* birthDate;
};
----------------
//Person.cpp
#include"Person.h"
Person::Person(int _id,int year,int month,int day):id(_id), birthDate(new Date(year,month,day))
{
}
int Person::getId()
{
return id;
}
Date* Person::getBirthDate() const
{
return birthDate;
}
Person::~Person()
{
if(birthDate)
delete birthDate;
birthDate = 0;
}
Person::Person(const Person& rhs)
{
this->id = rhs.id;
Date *date = rhs.getBirthDate();
this->birthDate = new Date(date->getYear(), date->getMonth(), date->getDay());
}
Person& Person::operator=(const Person& rhs)
{
delete birthDate;
this->id = rhs.id;
Date *date = rhs.getBirthDate();
this->birthDate = new Date(date->getYear(), date->getMonth(), date->getDay());
return *this;
}
-----------------------
//main.cpp
#include
#include"Person.h"
using namespace std;
#include
#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif
#define _CRTDBG_MAP_ALLOC
#include
#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif
void Exit()
{
int i = _CrtDumpMemoryLeaks();
assert( i == 0);
}
void displayPerson(Person &person1,Person &person2)
{
cout<<"\tPerson1 id:"<
int main()
{
atexit(Exit);
Person person1(111,1970,5,3);
Person person2(222,2000,11,8);
cout<<"After creating person1 and person2"<
person1 = Person(person2);
cout<<"\nAfter copying person2 to person1"<
person2.getBirthDate()->setYear(1963);
cout<<"\nAfter modifying person2's birthDate"<
cout<<"\n"<<(person1.getBirthDate()==person2.getBirthDate())<
}
-----------------------------
这个main.cpp可以检测内存泄露。。。
--------------
假设不要的就是你原来的。。。
person1 = Person(person2);
这里的信息量很大,首先通过person2对象创建了一个临时对象,然后事情并不是想象中的那样,这个临时对象被析构掉了!!也就是person2.birthDate 被delete了!!!!
然后将一个被析构掉的临时对象再次通过默认=复制到person1。。。。
然后结尾再对person2析构的话,就delete 两次,所以报错。
主要错误有两处,若具体修改,这段代码就面目全非了
1:person1 = Person(person2); 这句有问题 “=”这个运算符 在Person这个类中没有重载,因此,即使Person(person2); 这样进行强制转换(也不需要强制转换,他们类型一致)也不可以这样使用。
将person1 = Person(person2);这句话注释掉 就不会报错了。
2:cout<<"\n"<<(person1.getBirthDate()==person2.getBirthDate())<
#include