在我的课堂上,我写道
class Game {
private:
mtm::Dimensions dimensions;
std::vector<Character*> board;
public:
explicit Game(int height, int width):dimensions(height,width), board(height*width){
}
~Game() {}
};
但是我应该如何释放我的向量,我认为如果我保留d‘’tor为空,它会泄漏内存。
发布于 2020-06-24 16:09:10
如果Game
不是所有者,它不能释放内存。店主必须清理干净。
如果Game
是所有者,它可以删除析构函数中的所有元素
~Game() {
for (auto &character : board) {
delete character;
}
}
更好的方法是使用智能指针并删除析构函数
std::vector<std::unique_ptr<Character>> board;
您应该尝试遵循rule of 0
发布于 2020-06-24 16:10:00
假设您的Game
拥有这些对象,那么您的Game
析构函数将需要释放内存。据推测,Character
是用new
分配的。下面的代码将删除board
中的所有Character
,然后类变量(如vector
)将自动释放。
~Game() {
for ( Character *character : board )
delete character;
}
除非是针对指针的练习,否则通常建议不要使用裸指针,而是使用智能指针,如unique_ptr
或shared_ptr
。
std::vector<std::shared_ptr<Character>> board;
在这种情况下,将不会有泄漏,因为一旦没有人再指向Character
,它们将自动释放。
shared_ptr
和unique_ptr
的使用取决于你在做什么。
发布于 2020-06-24 16:07:38
向量是一个成员变量。成员变量,就像所有子对象一样,在销毁超级对象时自动销毁。隐式生成的析构函数为vector做了正确的事情。
请注意,向量包含指针。如果这些指针指向动态分配的对象,并且是指向这些对象的唯一指针,则必须删除这些对象,否则它们将泄漏。如果其他对象拥有指向的对象,则在此析构函数中不需要执行任何操作。
隐式析构函数正确的一个例子。在本例中,我假设该成员是公共的:
{
Character c;
Game g;
g.board.push_back(&c);
} // no leaks
避免使用空指针。如果您需要动态对象的所有权,则更喜欢使用RAII容器或智能指针。
https://stackoverflow.com/questions/62559166
复制相似问题