繁体   English   中英

从指针向量中删除对象

[英]Deleting objects from a vector of pointers

我看了很多非常相似的问题,但仍然无法解决。

考虑简单的类:

class Obj
{
public:
    Obj(int moose);
    ~Obj();

private:
    int* val;
};


Obj::Obj(int num)
{
    val = new int;

    *val = num;
}


Obj::~Obj()
{
    printf("Cleanup");
    delete val;
}

现在,我想有一个指向objs的指针向量。 来源详细说明了问题:

int main(int argc, const char * argv[])
{
    std::vector<Obj*> objs;

    Obj* o = new Obj(10);

    objs.push_back(o);

    objs.erase(objs.begin() + 0);

    // should have been deleted by now - I want the destructor to have been called
    // I have tried delete objs[0], casting to it and then deleting it.

    return 0;
}

仅在程序完成时才调用Obj中的析构函数。 我希望在从向量中删除对象时调用它。

澄清:我正在尝试使用向量中的引用删除对象。 我无法做到这一点。 我知道向量不会释放内存。 它只是从向量中删除引用。 任何人都可以提供代码来删除对象并使用向量中的引用调用析构函数。

编辑:

即使添加:

auto it = objs.begin() + 0;
delete *it;
objs.erase(it);

如建议的那样,Obj的析构函数不会触发。

正如许多评论所指出的那样, vector.erase仅从向量中删除元素。 它不会尝试删除任何关联的内存。
要显式删除关联的内存,您需要:

int main(int argc, const char * argv[])
{
    ...

    auto it = objs.begin() + i;
    delete *it;
    objs.erase(it);

}

实际上,在您的情况下:

int main(int argc, const char * argv[])
{
    std::vector<Obj*> objs;

    Obj* o = new Obj(10);
    objs.push_back(o);    

    auto it = objs.begin();
    delete *it;
    objs.erase(it);

}

您的代码还有许多其他不一致之处,还有针对您要执行的操作的更好的解决方案,例如:

  • 使用vector<Obj>

     int main(int argc, const char * argv[]) { std::vector<Obj> objs; objs.emplace_back(10); auto it = objs.begin(); objs.erase(it); } 
  • 如果您需要动态分配对象,但由于某种原因不希望向量处理该对象,则可以使用shared_ptrunique_ptr ,它们将为您处理释放:

     int main(int argc, const char * argv[]) { std::vector<std::unique_ptr<Obj>> objs; objs.emplace_back(new Obj(10)); auto it = objs.begin(); objs.erase(it); } 

当从向量中删除元素(即指针)时,您只是将其从容器向量中删除。 但是指针指向的位置仍然是堆上的有效内存。 如果要释放该内存,则应使用delete并显式释放该内存。 如果您不想自己管理内存,请使用智能指针。

当您从向量中删除一个项目时,该项目的析构函数将被调用。 但是,在这种情况下,该项目是一个指针,和指针没有析构函数。 指针指向的对象将不会调用其析构函数,直到您对指针使用delete为止。 如果指针被擦除并且您没有它的另一个副本,则您将永远无法删除它,并且会发生内存泄漏。

尽可能将对象本身放在向量中,而不要放在指针中。 这将减轻您繁琐的内存管理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM