让我们说我们创建一个Student类的对象,我们创建两个实例/对象类Student(即StudentA和StudentB).我们使用浅层复制来初始化B的数据成员,如下所示:
学生B =学生A;
然后我们摧毁了StudentB.我们在这里面临悬空指针的情况吗?为什么以及如何?请解释.
我们在这里面临悬空指针的情况吗?为什么以及如何?请解释.
这取决于学生的实施.如果学生看起来像这样......
class Student
{
public:
char* m_name;
Student(const char* name)
{
m_name = new char[strlen(name)+1];
strcpy(m_name,name);
}
~Student()
{
delete[] m_name;
}
};
Run Code Online (Sandbox Code Playgroud)
...然后出现问题:当你复制一个学生时,你有两个指向相同m_name数据的指针,当两个学生实例被删除时,m_name数据被删除两次,这是非法的.为避免该问题,Student需要一个显式的复制构造函数,以便复制的Student具有指向不同m_name数据的指针.
或者,如果学生看起来像这样......
class Student
{
public:
std::string m_name;
Student(const char* name)
: m_name(name)
{
}
};
Run Code Online (Sandbox Code Playgroud)
...然后没有问题,因为魔术(即显式复制构造函数)是在std :: string类中实现的.
总之,如果类包含分配和删除的指针,则需要显式复制构造函数(或者显式没有复制构造函数,但在任何一种情况下,不仅仅是默认构造函数).