首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何释放一个向量?

如何释放一个向量?
EN

Stack Overflow用户
提问于 2020-06-24 23:55:03
回答 4查看 121关注 0票数 0

在我的课堂上,我写道

代码语言:javascript
代码运行次数:0
运行
复制
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为空,它会泄漏内存。

EN

回答 4

Stack Overflow用户

发布于 2020-06-25 00:09:10

如果Game不是所有者,它不能释放内存。店主必须清理干净。

如果Game是所有者,它可以删除析构函数中的所有元素

代码语言:javascript
代码运行次数:0
运行
复制
~Game() {
    for (auto &character : board) {
        delete character;
    }
}

更好的方法是使用智能指针并删除析构函数

代码语言:javascript
代码运行次数:0
运行
复制
std::vector<std::unique_ptr<Character>> board;

您应该尝试遵循rule of 0

票数 4
EN

Stack Overflow用户

发布于 2020-06-25 00:10:00

假设您的Game拥有这些对象,那么您的Game析构函数将需要释放内存。据推测,Character是用new分配的。下面的代码将删除board中的所有Character,然后类变量(如vector)将自动释放。

代码语言:javascript
代码运行次数:0
运行
复制
~Game() {
   for ( Character *character : board )
      delete character;
}

除非是针对指针的练习,否则通常建议不要使用裸指针,而是使用智能指针,如unique_ptrshared_ptr

代码语言:javascript
代码运行次数:0
运行
复制
std::vector<std::shared_ptr<Character>> board;

在这种情况下,将不会有泄漏,因为一旦没有人再指向Character,它们将自动释放。

shared_ptrunique_ptr的使用取决于你在做什么。

票数 1
EN

Stack Overflow用户

发布于 2020-06-25 00:07:38

向量是一个成员变量。成员变量,就像所有子对象一样,在销毁超级对象时自动销毁。隐式生成的析构函数为vector做了正确的事情。

请注意,向量包含指针。如果这些指针指向动态分配的对象,并且是指向这些对象的唯一指针,则必须删除这些对象,否则它们将泄漏。如果其他对象拥有指向的对象,则在此析构函数中不需要执行任何操作。

隐式析构函数正确的一个例子。在本例中,我假设该成员是公共的:

代码语言:javascript
代码运行次数:0
运行
复制
{
    Character c;
    Game g;
    g.board.push_back(&c);
} // no leaks

避免使用空指针。如果您需要动态对象的所有权,则更喜欢使用RAII容器或智能指针。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62559166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档