c++ - 在元素自身的析构函数中删除指向静态 vector 中元素的指针

标签 c++ visual-c++ pointers destructor stdvector

下面的代码来 self 用动态内存管理编写的游戏。我有一个名为“all_gadgets”的静态 vector ,其中包含指向游戏中每个小工具的指针。 在运行时删除小工具时,我想从静态 vector 中删除相应的指针。我试过这个:

Gadget::~Gadget(){
    int i = Gadget::all_gadgets.size();
    for (std::vector<Gadget *>::iterator it = Gadget::all_gadgets.begin(); it!=all_gadgets.end(); ++it){

        if ((*it)==this){
            Gadget::all_gadgets.erase(it);

            break;
        }
    }


    int j = (i - Gadget::all_gadgets.size());
    if(j!=1)
        std::cout << j << " ooops! Gadget not deleted!!" << std::endl;
}

在上面的代码中,j 结果为零 :( 有什么建议吗?

将指针设置为 null 不是一个选项。 我正在使用 VC10。

最佳答案

为此使用侵入式双链表,插入、删除和有序迭代会更高效。

通常,链表的局部性较差。但是对于指针 vector ,虽然指针本身可能存储在很大的局部性中,但内容需要额外的间接级别和局部性损失。

有了侵入式链表,局部性就和内容的局部性一样好。因此,您达到了局部性的理论上限,加上廉价的插入和移除。


您的实际问题可能是由于没有为每个构造函数都进行插入而引起的。编译器默认生成复制构造函数(在 C++11 中为移动构造函数),它不会更新您的 all_gadgets 列表,除非您提供自己的列表。

关于c++ - 在元素自身的析构函数中删除指向静态 vector 中元素的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10211036/

相关文章:

c++ - 通过网络(远程屏幕广播应用程序)传输 JPEG 压缩的屏幕图 block 时,是否值得/推荐使用 zlib(或类似的)压缩?

C++ protected 成员访问

c++ - 使用 QPrintPreviewDialog 时内容不显示预览

windows - 如果我调用 GlobalLock(),然后未能调用 GlobalUnlock(),会发生什么情况?

pointers - 复制一片指针(指向新值)

c++使用用户输入数据实现多个功能

visual-studio - 有没有办法从项目文件中覆盖 $(VCTargetsPath) ?

C++ 如何通过可选的 typedef、使用 SFINAE 或其他方式选择类

c - 声明动态多维指针

c - 指向结构的指针数组 - 为什么需要 malloc(),为什么需要直接字段复制?