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

C++ C+;中参数列表中实例化对象的内存管理+;,c++,memory-leaks,instantiation,C++,Memory Leaks,Instantiation,如果我在参数列表中实例化对象而不使用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_

如果我在参数列表中实例化对象而不使用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\u id,Tile\u type)
是我不确定的部分,我不知道它最终是堆栈还是堆
tile\u list是一个
std::vector
,到目前为止,我假设它将处理我传递给它的
tile
对象的内存。这是正确的吗

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


另外,对代码样式的任何评论都是受欢迎的,我觉得作为一个结构,平铺可能会更好,所以特别欢迎对这一点的评论。

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

tile_list_.push_back(Tile(tile_id, tile_type));
它的副本将插入到向量中。理论上。实际上,在这种情况下,可能会出现复制省略,但这并不重要,我只是为了答案的完整性而这样说


通常,如果不使用
new
malloc
,就不会发生内存泄漏,当然,除非您使用的是在后端分配内存且不使用RAII的糟糕库。但这里不是这样,因为您使用的是
std

,所以听起来好像我想要一个方法来获取一个废弃对象,例如
rectangle
方法中的
void Draw(Surface*Surface,const Rect&rectangle){/*执行一些操作,但不要保留矩形*/}
也可以用与
push_back
相同的方式调用,因为矩形将被复制(或删除)到方法作用域,并且在作用域的末尾自动清理内存,对吗?@DavidMason yes。请注意,临时文件只能绑定到
const
引用,因此,如果签名使用
Rect&rectangle
而不是
const-Rect&rectangle
,则此操作不起作用。谢谢。我基本上只是盲目地复制了
vector::push_back(const T&x)
的签名,所以知道const是必要的很好。