C++中参数列表中实例化对象的内存管理

Memory management for objects instantiated in argument list in C++

本文关键字:内存 管理 对象 实例化 参数 列表 C++      更新时间:2023-10-16

如果我在参数列表中实例化对象而不使用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对象的内存。这是正确的吗?

现在,我正在考虑在其他地方制作一个方法,可以将类似的实例化对象作为参数。这在参数列表中会是什么样子,在方法和调用代码中必须做些什么才能确保没有内存泄漏?

附言:任何关于代码风格的评论都是受欢迎的,我有一种感觉,Tile作为一个结构可能会更好,所以特别欢迎对此进行评论。

您不会有内存泄漏,并且对象将在表达式之后被销毁。

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

将其副本插入到矢量中理论上。在实践中,在这种情况下可能会出现省略副本的情况,但这无关紧要,我只是为了答案的完整性而这么说。

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