1

new キーワードを使用せずに引数リストでオブジェクトをインスタンス化すると、メモリ リークが発生しますか? たとえば、私はタイルクラスを持っています:

// tile.h (too small for implementation)
class Tile {
  public:
    enum Type {
        TYPE_NONE = 0,
        TYPE_NORMAL,
        TYPE_BLOCK
    };

    inline Tile(const int id, const Type type) : id_(id), type_(type) {};
    inline int id() const { return id_; };
    inline Type type() const { return type_; };

  private:
    int id_;
    Type type_;
};

後で、テキスト ファイルで指定されたいくつかのタイルを読み込んでいます。

// ...
int tile_id;
Tile::Type tile_type;
fscanf(file_handle, "%d:%d ", &tile_id, &tile_type);
tile_list_.push_back(Tile(tile_id, tile_type)); // this is the line of interest
// ...

これはうまくいくようです。Tile(tile_id, tile_type)不明な部分です。スタックになるかヒープになるかわかりません。tile_list_は であり、これまでのところ、渡すオブジェクトstd::vector<Tile>のメモリを処理すると想定しています。Tileこれは正しいです?

現在、同様にインスタンス化されたオブジェクトを引数として取ることができるメソッドを別の場所で作成することを検討しています。これは引数リストでどのように見えるでしょうか? また、メモリ リークが発生しないようにするには、メソッドと呼び出しコードで何を行う必要がありますか?

PSコードスタイルに関するコメントも大歓迎です.Tileは構造体として優れているのではないかと感じているので、特にこれに関するコメントを歓迎します.

4

1 に答える 1

3

メモリ リークは発生せず、オブジェクトは式の後に破棄されます。

tile_list_.push_back(Tile(tile_id, tile_type));

そのコピーがベクターに挿入されます。理論的には。実際には、この場合はおそらくコピー省略が発生しますが、それは無関係です。回答の完全性のためにこれを述べているだけです。

new一般に、またはを使用しない場合、メモリ リークは発生しませんmalloc。もちろん、バックエンドでメモリを割り当て、RAII を使用しない貧弱なライブラリを使用する場合を除きます。しかし、これはここでは当てはまりませんstd

于 2012-07-08T10:53:00.143 に答える