为什么下面的类需要析构函数?如何添加一个?

时间:2014-09-11 18:54:57

标签: c++

#ifndef PERSON_H
#define PERSON_H

#include <string>
using namespace std;
class Person
{
public:
    Person()
    {
        numberOfchildren = 0;
        children = new string[20];
    }
    void addAChild(string name)
    {
        children[numberOfchildren++] = name;
    }
    string *getChildren()
    {
        return children;
    }
    int getNumberOfChildren()
    {
        return numberOfchildren;
    }
private:
    string *children;
    int numberOfchildren;
};
#endif

3 个答案:

答案 0 :(得分:1)

该类需要一个析构函数,因为它在构造函数的堆上分配了一个字符串数组。

如果类超出范围而不删除该字符串数组,则会出现内存泄漏。

编辑:您应该考虑使用std::vector。只需致电vector<T>::resize(size_t)即可设置初始尺寸。

答案 1 :(得分:1)

如果您使用标准类std::vector<std::string>而不是手动分配的数组,那会更好。例如

#ifndef PERSON_H
#define PERSON_H

#include <string>
using namespace std;
class Person
{
public:
    Person()
    {
    }

    void addAChild( const string &name )
    {
        children.push_back( name );
    }
    vector<string> getChildren() const
    {
        return children;
    }
    int getNumberOfChildren() const
    {
        return children.size();
    }
private:
    vector<string> children;
};
#endif

在这种情况下,隐含定义的析构函数就足够了。

至于你的代码,你必须为数组子节点释放已分配的内存。所以析构函数看起来像

~Person()
{
    delete []children;
}

考虑到如果你在方法getChildren中返回指针,那么每个人都可以改变任何人的孩子。

答案 2 :(得分:0)

此类需要析构函数,因为它包含指向堆上分配的对象的指针(子数组)。如果没有析构函数,当删除此类的实例时,子数组将保留在内存中:这称为内存泄漏

要创建析构函数,只需将方法~Person()添加到类成员

即可
~Person()
{
    delete[] children;
}