1

newキーワードandを使用せずに C++ コードを記述しようとしていますdelete

まず、それは良い習慣ですか?

このようなコーディングの副作用の 1 つは、nullptr空の値を信頼できないことです。

例えば:

std::array<std::array<fb::Block *, Panel::Y>, Panel::X> blocks;

になる

std::array<std::array<fb::Block, Panel::Y>, Panel::X> blocks;

空の Block を説明する最良の方法は何ですか?

私はこれを使用することについて考えました:

class Block {
  private:
  protected:
  public:
  ...
  static const Block EMPTY;
  };
}

const Block EMPTY(0, BlockType::TUTORIAL, 0, 0);

皆さんはどう思いますか ?これは良いアプローチですか?

4

3 に答える 3

4

安全なコードを書き、メモリ管理を簡素化したい場合は、delete. しかし、破棄する必要はありませんnew。最善の方法は、必要なオブジェクトを割り当てて、またはnewのようなスマート ポインターに格納することです。これらのポインタはいつでも と比較できます。そして、すべてのオブジェクトが自動的に削除されます。std::shared_ptrstd::unique_ptrnullptr

このシナリオではrawnewmake_sharedand の呼び出しに置き換えるようアドバイスする人もいます。make_unique

関連する質問は、関数に引数を渡すためT&にいつ使用するか、いつ使用するかです。T*経験則は次のとおりです。T*入力引数が存在しない可能性がある場合は常に使用T&し、入力引数が提供されていることを確認するために使用します。

于 2013-02-16T17:03:22.367 に答える
1

C ++は、非常に高レベルの機能(完全なOO、多重継承、ジェネリックプログラミング)を提供しながら、最大のパフォーマンスを実現するように設計された言語です。「最大パフォーマンス」の一部は、明示的なメモリ管理の正確な使用です(はい、言語があり、BoehmコレクターのようなC ++のパッケージでさえ、割り当てられたメモリを追跡する負担を軽減します。コストは莫大で、時には法外なものになります) 。C ++はツールであり、たまたま非常に鋭いエッジがあります。子供の手に近づかないでください。細心の注意を払って使用してください。

この言語の機能は、適切なときに必要な場所で使用できるように含まれています。

于 2013-02-16T17:13:31.063 に答える
0

このようなコーディングの副作用の 1 つは、空の値に対して nullptr を当てにできないことです。

いったい何について話しているのですか?nullptrそのポインターがどこを指すはずだったかに関係なく、細かい空のポインターを作成します。newやとは何の関係もありませんdelete。何もしなくnewても、空であろうとなかろうと、ポインターの使用が妨げられることはありません。

まず、それは良い習慣ですか?

newとはどちらdeleteも恐ろしく安全ではないため、伝染性のバグの疫病のように、コードベースからそれらを追い出すことはまったく問題ありません。絶対に絶対に使用しないでくださいdeletenewいくつかの種類の非常に薄いラッパーの正当性があるため、少し複雑です。

template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) {
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

ただし、スマート ポインターの割り当てを特に意図したラッパー以外では、 non-placementornewを使用しないでください。プログラムの正確性を安全に保証できるスマート ポインターやコンテナーなどの RAII クラスを使用します。deletedelete[]

于 2013-02-16T16:58:43.237 に答える