c++ - 从指针 vector 中删除对象

标签 c++ pointers vector

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

考虑简单类:

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 的指针 vector 。来源详细说明了问题:

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 中的析构函数仅在程序结束时调用。我希望在从 vector 中删除对象时调用它。

澄清:我正在尝试使用 vector 中的引用删除对象。我不能让它这样做。我知道 vector 不会释放内存。它只是从 vector 中删除引用。谁能提供删除对象并使用 vector 中的引用调用析构函数的代码。

编辑:

即使在添加之后:

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

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

最佳答案

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

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);
    }
    
  • 如果您需要动态分配您的对象,但出于某种原因不想让 vector 处理它,您可以使用shared_ptr。或 unique_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);
    }
    

关于c++ - 从指针 vector 中删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22548510/

相关文章:

c++ - 当主线程显然未被阻塞时,QProgressDialog卡住

c++ - gdb 映射显示不正确的成员变量

c++ - 加扰输入算法的效率

c++ - vector<int> 上的 memset

c++ - 关于 vector 的困惑

c++ - static 是 C++ 中的修饰符吗?

c++ - 重新定义一个int错误

c++ - 从类 C++ 返回映射

c++ - 为什么我们不能泛化指针声明?

c - 如何释放()我的变量