1

如果我在参数列表中实例化对象而不使用 new 关键字,我会得到内存泄漏吗?例如,我有一个 tile 类:

// 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));

它的副本被插入到向量中。理论上。实际上,在这种情况下可能会发生复制省略,但这无关紧要,我只是为了答案的完整性而说明这一点。

一般来说,如果你不使用newor malloc,你就不会发生内存泄漏,除非你当然使用了一个在后端分配内存并且不使用 RAII 的糟糕库。但这里不是这种情况,因为您使用的是std.

于 2012-07-08T10:53:00.143 回答