| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 671 人关注过本帖
标题:析构函数带来的错误
只看楼主 加入收藏
circlesky
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-4-5
结帖率:50%
收藏
 问题点数:0 回复次数:5 
析构函数带来的错误
各位高手,我的程序如下,如果没有析构函数(红色文字)就能正常运行,如果加上析构函数,就不能正常运行。请问为什么?如果要用析构函数的话,应该怎么写代码。谢谢!
#include<iostream.h>
#include<string.h>

class Person
{
private:
    char* name;
    int age;
    char* gender;
public:
    Person(){}
    Person(const char *name_t,const int age_t,const char *gender_t);
    Person(Person& person);
    void setName(const char *name_t);
    void setAge(const int age_t);
    void setGender(const char *gender_t);
    char* getName();
    int getAge();
    char* getGender();
    void display();
    ~Person()
    {
        delete[] name;
        delete[] gender;
    }
};
Person :: Person(const char *name_t,const int age_t,const char *gender_t)
{
    name = new char[strlen(name_t) + 1];
    strcpy(name,name_t);
    gender = new char[strlen(gender_t) + 1];
    strcpy(gender,gender_t);
    age = age_t;
}
Person :: Person(Person& person)
{
    name = new char[strlen(person.name) + 1];
    strcpy(name,person.name);
    gender = new char[strlen(person.gender) + 1];
    strcpy(gender,person.gender);
    age = person.age;   
}

void Person::setName(const char* name_t)
{
    name = new char[strlen(name_t) + 1];
    strcpy(name,name_t);
}
void Person ::setAge(const age_t)
{
    age = age_t;
}
void Person :: setGender(const char* gender_t)
{
    gender = new char[strlen(gender_t) + 1];
    strcpy(gender,gender_t);
}
char* Person :: getName()
{
    return name;
}
int Person :: getAge()
{
    return age;
}
char* Person :: getGender()
{
    return gender;
}
void Person :: display()
{
    cout << name << " | " << age << " | " << gender << endl;
}

//建立类模板Relation,该类模板生成的模板类由参数K、T决定。
template <class K,class T>
class Relation
{
private:
    K key;
    T value;
public:
    Relation(){}
    Relation(const K& k,const T& v)
    {
        key = k;
        value = v;
    }
    K getKey()
    {
        return key;
    }
    T getValue()
    {
        return value;
    }
    void setKey(const K& k)
    {
        key = k;
    }
    void setValue(const T& v)
    {
        value = v;
    }
};
//在主函数中测试
int main()
{
    Relation<char* ,Person> r;
    r.setKey("CEO");
    Person person("张三",40,"男");
    r.setValue(person);
    cout << r.getKey() <<" : ";
    r.getValue().display();
    return 0;
}
搜索更多相关主题的帖子: 函数 
2010-06-03 21:04
思忆季节
Rank: 2
来 自:珠海
等 级:论坛游民
帖 子:42
专家分:62
注 册:2010-5-12
收藏
得分:0 
#include<iostream.h>
#include<string.h>

class Person
{
private:
    char* name;
    int age;
    char* gender;
public:
    Person(){}
    Person(const char *name_t,const int age_t,const char *gender_t);
    Person(Person& person);
    void setName(const char *name_t);
    void setAge(const int age_t);
    void setGender(const char *gender_t);
    char* getName();
    int getAge();
    char* getGender();
    void display();
    ~Person()
    {
      //delete[] name;
      //delete[] gender
;
    }   
};
Person :: Person(const char *name_t,const int age_t,const char *gender_t)
{
    name = new char[strlen(name_t) + 1];
    strcpy(name,name_t);
    gender = new char[strlen(gender_t) + 1];
    strcpy(gender,gender_t);
    age = age_t;
}
Person :: Person(Person& person)
{
    name = new char[strlen(person.name) + 1];
    strcpy(name,person.name);
    gender = new char[strlen(person.gender) + 1];
    strcpy(gender,person.gender);
    age = person.age;
   
}

void Person::setName(const char* name_t)
{
    name = new char[strlen(name_t) + 1];
    strcpy(name,name_t);
}
void Person ::setAge(const age_t)
{
    age = age_t;
}
void Person :: setGender(const char* gender_t)
{
    gender = new char[strlen(gender_t) + 1];
    strcpy(gender,gender_t);
}
char* Person :: getName()
{
    return name;
}
int Person :: getAge()
{
    return age;
}
char* Person :: getGender()
{
    return gender;
}
void Person :: display()
{
    cout << name << " | " << age << " | " << gender << endl;
}

//建立类模板Relation,该类模板生成的模板类由参数K、T决定。
template <class K,class T>
class Relation
{
private:
    K key;
    T value;
public:
    Relation(){}
    Relation(const K& k,const T& v)
    {
        key = k;
        value = v;
    }
    K getKey()
    {
        return key;
    }
    T getValue()
    {
        return value;
    }
    void setKey(const K& k)
    {
        key = k;
    }
    void setValue(const T& v)
    {
        value = v;
    }
};
//在主函数中测试
int main()
{
    Relation<char* ,Person> r;
    r.setKey("CEO");
    Person person("张三",40,"男");
    r.setValue(person);
    cout << r.getKey() <<" : ";
    r.getValue().display();
    return 0;
}

红字里面不要就行了,析构函数会释放掉分配的内存的;
2010-06-03 22:07
思忆季节
Rank: 2
来 自:珠海
等 级:论坛游民
帖 子:42
专家分:62
注 册:2010-5-12
收藏
得分:0 
还有定义字符串类型的话,个人觉得很多地方用string来定义比用char好多了,可以减少很多累赘的代码!呵呵
2010-06-03 22:10
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:0 
程序代码:
/*
    重载赋值操作符,因为默认的赋值操作符起到的作用是两个指针指向同一块内存空间
    两个对象就有两个析构函数,同一块内存空间被delete两次,是会出问题的。
    */
    void operator= (const Person& o)
    {
        name = new char[strlen(o.name) + 1];
        strcpy(name,o.name);
        gender = new char[strlen(o.gender) + 1];
        strcpy(gender,o.gender);
        age = o.age; 
    }//在类体里加上后,能通过编译,运行正常。
感觉你的程序还会产生内存泄露,现在还不知道什么改。指向新内存应该把原先向的内存释放嘛

迭代的是人,递归的是神。
2010-06-05 08:01
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:0 
程序代码:
#include<iostream.h>
#include<string.h>
class Person
{
private:
    char* name;
    int age;
    char* gender;
public:
    Person():name(0),gender(0){}//这里最好把指针赋下值的
    Person(const char *name_t,const int age_t,const char *gender_t);
    Person(Person& person);
    void setName(const char *name_t);
    void setAge(const int age_t);
    void setGender(const char *gender_t);
    char* getName();
    int getAge();
    char* getGender();
    void display();
    void operator= (const Person& o)
    {
        name = new char[strlen(o.name) + 1];
        strcpy(name,o.name);
        gender = new char[strlen(o.gender) + 1];
        strcpy(gender,o.gender);
        age = o.age; 
    }
    ~Person()
    {
        delete[] name;
        delete[] gender;
    }
};
Person :: Person(const char *name_t,const int age_t,const char *gender_t)
{
    name = new char[strlen(name_t) + 1];
    strcpy(name,name_t);
    gender = new char[strlen(gender_t) + 1];
    strcpy(gender,gender_t);
    age = age_t;
}
Person :: Person(Person& person)
{
    //if(name != 0) delete [] name;我尝试着添上这么一句,结果会有运行错误……可能是因为是构造函数吧
    name = new char[strlen(person.name) + 1];
    strcpy(name,person.name);
    gender = new char[strlen(person.gender) + 1];
    strcpy(gender,person.gender);
    age = person.age; 
}
void Person::setName(const char* name_t)
{
    delete [] name;//释放原先的内存空间
    name = new char[strlen(name_t) + 1];
    strcpy(name,name_t);
}
void Person ::setAge(const age_t)
{
    age = age_t;
}
void Person :: setGender(const char* gender_t)
{
    delete [] gender;//释放原先的内存空间
    gender = new char[strlen(gender_t) + 1];
    strcpy(gender,gender_t);
}
char* Person :: getName()
{
    return name;
}
int Person :: getAge()
{
    return age;
}
char* Person :: getGender()
{
    return gender;
}
void Person :: display()
{
    cout << name << " | " << age << " | " << gender << endl;
}
//建立类模板Relation,该类模板生成的模板类由参数K、T决定。
template <class K,class T>
class Relation
{
private:
    K key;
    T value;
public:
    Relation(){}
    Relation(const K& k,const T& v)
    {
        key = k;
        value = v;
    }
    K getKey()
    {
        return key;
    }
    T getValue()
    {
        return value;
    }
    void setKey(const K& k)
    {
        key = k;
    }
    void setValue(const T& v)
    {
        value = v;
    }
};
//在主函数中测试
int main()
{
    Relation<char* ,Person> r;
    r.setKey("CEO");
    Person person("张三",40,"");
    r.setValue(person);
    cout << r.getKey() <<" : ";
    r.getValue().display();
    return 0;
}


迭代的是人,递归的是神。
2010-06-05 08:15
circlesky
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-4-5
收藏
得分:0 
回复 5楼 lintaoyn
谢谢!明白了!
2010-06-05 15:36
快速回复:析构函数带来的错误
数据加载中...
 
   



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

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