C ++で何かを削除する必要があるかどうかはどうすればわかりますか?

EKW

次のクラスを想像してみてください。

class MyString {
public:
    const char* str;
    std::size_t str_len;

    MyString(const char* str, std::size_t str_len)
        : str { str }
        , str_len { str_len }
    {}
}

のデストラクタの実装について少し混乱していMyStringます。私の最初の考えは、次のようになるだろうということでした。

~MyString() {
    delete [] str;
}

しかし、strが割り当てられているかどうか確信が持てない場合、どうすればstrを削除できますか?たとえば、次のMyStringようなインスタンスを作成できます

const char* c_string = "Hello, World!";
MyString my_string(c_string, 13);

この場合、ヒープ上で宣言されていないため削除しないでくださいstr。ただし、次のMyStringようなインスタンスを作成した場合は次のようになります。

char* char_array = new char[13]{'H','e','l','l','o',',',' ','W','o','r','l','d','!'};
MyString my_string(char_array, 13);

削除しないstrと、ヒープ上で宣言されるため、メモリリークが発生します(私は推測します)。しかし、私MyStringこのようなインスタンスを作成した場合

char* char_array = new char[13]{'H','e','l','l','o',',',' ','W','o','r','l','d','!'};
MyString my_string(char_array + 3, 10);

私はべきではありません削除str、それはヒープ上だが、それが割り当てられていないからです。割り当てられている他の何かの一部を指しているだけです。

では、削除してはいけないものを削除したり、削除する必要のあるものを削除できなかったりしないようにするにはどうすればよいでしょうか。MyStringがchar*sの代わりにconst char*sを使用した場合、答えは異なりますか?使用した場合はどうなりMyString my_string = new MyString...ますか?

編集:明確にするために、私は実際には文字列クラスを書いていません。私はバイト配列としてchar配列を使用しています。バイトが0になる可能性があるため、std :: stringは機能しないと思います。

ベン・ヴォイト

適用されるいくつかの異なるパターンがあります。

  1. 常に割り当てるパターン。このアプローチでは、クラスは渡されたリソースの所有権を取得せず、割り当てたバッファーにコピーを作成するため、デストラクタで割り当てを解除する方法を知っています。元のパラメータはクラスを呼び出すコードによって所有されており、クラスインスタンスには独立したコピーがあるため、その呼び出し元は必要なときにいつでも独自のデータをクリーンアップする必要があります。例:std::string

  2. 呼び出し元が指定した削除者のパターン。このアプローチでは、クラスが所有権を取得し、さまざまなアロケーター/デアロケーターのペアに対応するために、データの割り当て解除方法を知っている関数または関数オブジェクトであるパラメーターを受け入れます。クラスデストラクタは、このデリータ関数/関数オブジェクトを呼び出し、その特定のバッファに必要な正しい割り当て解除(またはまったく割り当て解除)を実行します。例:std::shared_ptr

  3. ネストされた所有権のパターン。ここでは、クラスは元のデータブロックへのポインタまたは参照を保持するだけです。呼び出し元には、データを解放する所有権と責任がありますが、作成したクラスインスタンスが存在する限り、そのブロックを有効に保つ必要があります。これは実行時のオーバーヘッドが最も低いですが、追跡するのが最も困難です。例:C ++ 11ラムダでの参照による変数キャプチャ。

これらのいずれをクラスの設計に使用する場合でも、クラスのユーザーが不思議に思うことがないように、必ず文書化してください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

asp.netで画像のC#のサイズを変更するにはどうすればよいですか?何か変更がありますか?

分類Dev

C#すべての行が値を返すわけではありません。どうすればよいかわかりません。

分類Dev

文字列がCでfloatになり得るかどうかを確認する方法はありますか?

分類Dev

最後の数値/値の後にコンマは必要ありません。削除するにはどうすればよいですか(c ++、ループ)

分類Dev

C#でArgumentExceptionまたはArgumentNullExceptionをスローする必要があるかどうかを判断する方法

分類Dev

C ++ファイルを削除する前に、ファイルが存在するかどうかを確認する必要がありますか?

分類Dev

C#NameValueCollection:キーを削除する前に、キーが存在するかどうかを確認する必要がありますか?

分類Dev

SQLまたはC#でjsonから\ "を削除するにはどうすればよいですか?

分類Dev

C#数値がグループ値のいずれかであるかどうかを確認するにはどうすればよいですか?

分類Dev

C#でdouble値がnullかどうかを確認するにはどうすればよいですか?

分類Dev

C ++でタプルが空かどうかを確認するにはどうすればよいですか

分類Dev

javascriptからc ++関数を呼び出す必要があります。それは可能かどうか?

分類Dev

C ++で変数を削除するにはどうすればよいですか

分類Dev

商が整数かどうかを確認するにはどうすればよいですか?C ++

分類Dev

C#番号が大きいかどうかを確認するにはどうすればよいですか?

分類Dev

関数が呼び出されるたびに getline() を使用する必要があります。txt で同じ行を繰り返し読まないようにするにはどうすればよいですか? c++

分類Dev

C ++では、クラスが継承チェーンの最後のクラス/子であるかどうかを確認するにはどうすればよいですか?つまり、基本クラスの反対側にあります

分類Dev

C ++関数にインライン化する機能があるかどうかを判断するにはどうすればよいですか?

分類Dev

C#のOrderedDictionaryのインデックスまたはキーで値にアクセスする必要があるかどうかを確認するにはどうすればよいですか?

分類Dev

C#のwpfプロジェクトの「キャッチまたはスローされたタイプはsystem.exceptionから派生する必要があります」エラーを修正するにはどうすればよいですか?

分類Dev

Swiftの代わりにObjective-CでAWSSDK for iOSを使用するにはどうすればよいですか?

分類Dev

文字列がファイル内で一意であるかどうか、およびC#で別のファイルに書き込まれているかどうかを確認するにはどうすればよいですか?

分類Dev

変数がCで「const」修飾子タイプであるかどうかを確認するにはどうすればよいですか?

分類Dev

クレームに電子メールがありません-B2Cから何が渡されているかを見つけて修正するにはどうすればよいですか?

分類Dev

C#-タイプが具象であるかどうかを確認するにはどうすればよいですか?

分類Dev

現在のディレクトリがCのルートであるかどうかを確認するにはどうすればよいですか?

分類Dev

文字列内のデータがC ++の数値であるかどうかを確認するにはどうすればよいですか?

分類Dev

除算の結果がCの整数であるかどうかを確認するにはどうすればよいですか?

分類Dev

入力がC ++のintであるかどうかを確認するにはどうすればよいですか?

Related 関連記事

  1. 1

    asp.netで画像のC#のサイズを変更するにはどうすればよいですか?何か変更がありますか?

  2. 2

    C#すべての行が値を返すわけではありません。どうすればよいかわかりません。

  3. 3

    文字列がCでfloatになり得るかどうかを確認する方法はありますか?

  4. 4

    最後の数値/値の後にコンマは必要ありません。削除するにはどうすればよいですか(c ++、ループ)

  5. 5

    C#でArgumentExceptionまたはArgumentNullExceptionをスローする必要があるかどうかを判断する方法

  6. 6

    C ++ファイルを削除する前に、ファイルが存在するかどうかを確認する必要がありますか?

  7. 7

    C#NameValueCollection:キーを削除する前に、キーが存在するかどうかを確認する必要がありますか?

  8. 8

    SQLまたはC#でjsonから\ "を削除するにはどうすればよいですか?

  9. 9

    C#数値がグループ値のいずれかであるかどうかを確認するにはどうすればよいですか?

  10. 10

    C#でdouble値がnullかどうかを確認するにはどうすればよいですか?

  11. 11

    C ++でタプルが空かどうかを確認するにはどうすればよいですか

  12. 12

    javascriptからc ++関数を呼び出す必要があります。それは可能かどうか?

  13. 13

    C ++で変数を削除するにはどうすればよいですか

  14. 14

    商が整数かどうかを確認するにはどうすればよいですか?C ++

  15. 15

    C#番号が大きいかどうかを確認するにはどうすればよいですか?

  16. 16

    関数が呼び出されるたびに getline() を使用する必要があります。txt で同じ行を繰り返し読まないようにするにはどうすればよいですか? c++

  17. 17

    C ++では、クラスが継承チェーンの最後のクラス/子であるかどうかを確認するにはどうすればよいですか?つまり、基本クラスの反対側にあります

  18. 18

    C ++関数にインライン化する機能があるかどうかを判断するにはどうすればよいですか?

  19. 19

    C#のOrderedDictionaryのインデックスまたはキーで値にアクセスする必要があるかどうかを確認するにはどうすればよいですか?

  20. 20

    C#のwpfプロジェクトの「キャッチまたはスローされたタイプはsystem.exceptionから派生する必要があります」エラーを修正するにはどうすればよいですか?

  21. 21

    Swiftの代わりにObjective-CでAWSSDK for iOSを使用するにはどうすればよいですか?

  22. 22

    文字列がファイル内で一意であるかどうか、およびC#で別のファイルに書き込まれているかどうかを確認するにはどうすればよいですか?

  23. 23

    変数がCで「const」修飾子タイプであるかどうかを確認するにはどうすればよいですか?

  24. 24

    クレームに電子メールがありません-B2Cから何が渡されているかを見つけて修正するにはどうすればよいですか?

  25. 25

    C#-タイプが具象であるかどうかを確認するにはどうすればよいですか?

  26. 26

    現在のディレクトリがCのルートであるかどうかを確認するにはどうすればよいですか?

  27. 27

    文字列内のデータがC ++の数値であるかどうかを確認するにはどうすればよいですか?

  28. 28

    除算の結果がCの整数であるかどうかを確認するにはどうすればよいですか?

  29. 29

    入力がC ++のintであるかどうかを確認するにはどうすればよいですか?

ホットタグ

アーカイブ