English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C++ コンストラクタ内でnewを使用する際の注意点

newを使用してオブジェクト内のポインタメンバーを初期化する際に直面する問題

コンストラクタでnewを使用してポインタメンバーを初期化する場合、デストラクタではdeleteを使用し、newに対応するdelete、new[]に対応するdelete[]を使用する必要があります。

複数のコンストラクタがある場合、すべてのコンストラクタは同じ方法でnewを使用する必要があります。newを使用しない場合も、new[]を使用しない場合もです。なぜなら、析构関数は一つしか存在しないため、すべてのコンストラクタはデストラクタと互換性を持たなければなりません。

PS. コンストラクタ内でnewを使用してポインタを初期化する場合、ポインタを空(0)に初期化することができます。/NULL または C++11(nullptr)を使用すると、deleteが[]を持っていなくても空ポインタと互換性があります。

複製コンストラクタと代入コンストラクタを各自で定義し、深いコピーを使用して、一つのオブジェクトをもう一つのオブジェクトに初期化します。以下のように、一つのオブジェクトをもう一つのオブジェクトにコピーします:

代入コンストラクタ:

  • 十分な空間を割り当てて、コピーされたデータを格納します
  • データのコピーは、ただのアドレスではありません
  • 影響を受けた静的クラスメンバーを更新します
String:String(const String & st)
{
  num_Strings++;
  len = st.len;
  str = new char[len+1];
  std::strcpy(str, st.str());
}

代入コンストラクタ:

  • 自己複製の状況を確認します
  • メンバー指針が指しているメモリを解放する前に
  • データのコピーは、ただのアドレスではありません
  • 呼び出し元オブジェクトへの参照を返します
String & String:operator=(const String & st)
{
  if(this == &st)
    return; *this;
  else
    delete [] str;
    len = st.len;
    str = new char[len+1];
    std::strcpy(str, st.str());
  return; *this;
}

これで本文の全てです。本文の内容が皆様の学習や仕事に役立つことを願っています。また、ナイアラチュートリアルのサポートをどうぞ。

声明:本文の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーにより自発的に貢献し、アップロードされた内容であり、本サイトは所有権を持ちません。また、人間による編集は行われていません。著作権侵害を疑う内容があれば、メールを送信してください:notice#oldtoolbag.com(メールを送信する際は、#を@に置き換えてください。侵害を報告する場合は、関連する証拠を提供し、一旦確認されると、本サイトは即座に侵害された内容を削除します。)

おすすめ