コピー コンストラクター、自明な代入演算子、および自明なデストラクタを持つ動的サイズのテキスト オブジェクトは存在しますか?
動的サイズ、いいえ。何かが自明なデストラクタを持つには、オブジェクトのデストラクタが暗黙的 (またはデフォルト) であり、非静的メンバー オブジェクトにも暗黙的 (またはデフォルト) デストラクタがあることが必要です。動的に割り当てられるものはすべてdelete []
、デストラクタの行に沿ったどこかを必要とするため、この制約を満たすことはできません。
上記を拡張するために、で何が起こるかの(非常に削減された)例を考えてみましょうstd::string
:
namespace std
{
// Ignoring templates and std::basic_string for simplicity
class string
{
private:
char* internal_;
// Other fields
public:
string(const char* str)
: internal_(new char[strlen(str) + 1])
{ }
};
}
デストラクタをデフォルトのままにしておくとどうなるかを考えてみましょう: スタックに割り当てられたchar *
もの (つまり、ポインターが指すものではなく、ポインター自体)が破壊されます。これにより、メモリ リークが発生する可能性があります。これは、参照がなく解放できない領域が割り当てられているためです。したがって、デストラクタを宣言する必要があります。
~string()
{
delete[] internal_;
}
ただし、これを行うと、デストラクタはユーザー定義になり、自明ではなくなります。
これは、動的に割り当てられるものすべてで問題になります。shared_ptr
aや a のようなものvector<char>
をメンバー変数として使用しても、これを修正できないことに注意してください。それらは私たちのクラスでスタックに割り当てられているかもしれませんが、その下では単にメモリ管理を処理しているだけnew []
ですdelete []
.
これを満たすには、スタック割り当てchar
配列を使用する必要があります。つまり、動的割り当てがないため、固定サイズになります。