联合是用户定义的数据或类类型,任何时候都只包含其成员列表中的一个对象。假设需要动态分配所有可能的候选成员。例如:
// Union Destructor
#include <string>
using namespace std;
union Person
{
private:
char* szName;
char* szJobTitle;
public:
Person() : szName (nullptr), szJobTitle (nullptr) {}
Person (const string& strName, const string& strJob)
{
szName = new char[strName.size()];
strcpy (szName, strName.c_str());
szJobTitle = new char [strJob.size()];
strcpy (szJobTitle, strJob.c_str()); // obvious, both fields points at same location i.e. szJobTitle
}
~Person() // Visual Studio 2010 shows that both szName and szJobTitle
{ // points to same location.
if (szName) {
delete[] szName; // Program crashes here.
szName = nullptr; // to avoid deleting already deleted location(!)
}
if (szJobTitle)
delete[] szJobTitle;
}
};
int main()
{
Person you ("your_name", "your_jobTitle");
return 0;
}
上面的程序在 ~Person 的第一个 delete 语句处崩溃(当 szName 包含有效的内存位置时,为什么?)。
正确的析构函数实现方式是什么?
同样地,如果我的类包含联合成员,如何销毁类对象(如何编写包含 Union 的类的析构函数)?