#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
答案 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;
}