共用体は、任意の時点でメンバーのリストから 1 つのオブジェクトのみを含む、ユーザー定義のデータ型またはクラス型です。考えられるすべての候補メンバーを動的に割り当てる必要があるとします。例えば。
// 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 の最初の削除ステートメントでクラッシュします (szName に有効なメモリ位置が含まれているとき、なぜですか?)。
デストラクタの正しい実装は何ですか?
同じように、私のクラスにユニオンメンバーが含まれている場合、クラスオブジェクトを破棄する方法 ( Union を含むクラスのデストラクタを記述する方法)?