代码之家  ›  专栏  ›  技术社区  ›  San Jacinto

C++ STD::队列::()调用析构函数。指针类型是什么?

  •  14
  • San Jacinto  · 技术社区  · 14 年前

    我有一个 std::queue 它被包装为一个模板类,以创建线程安全队列。这个类有两个版本:一个存储值类型,一个存储指针类型。

    对于指针类型,在销毁时删除队列元素时遇到问题。原因是我不知道如何安全地从队列中删除项目。

    This 引用状态(真空的,所以我猜它实际上并没有声明)从队列中移除元素的唯一方法是调用 pop() . 参考资料还说 流行音乐() 调用该项的析构函数。

    这会导致指针类型出现问题,因为它们可能指向聚合,也可能不指向聚合。如果其中一个指向聚合,它们都将指向聚合,但由于包装器是模板化的,因此无法保证我们处理的是哪种类型(聚合或非聚合)。

    那么,什么时候 调用析构函数,会发生什么?如何确保所有内容都被删除,并且内存释放正确?

    最后,我的解决方案是使用旧版本的GCC for ARM9。我无法控制这一切。我知道有些库具有智能指针和容器,可以在这里提供帮助,但它们对我来说是禁止的。

    3 回复  |  直到 10 年前
        1
  •  21
  •   anon anon    14 年前

    在线资源是值得你为之付出的-获得适当的参考,如 Josuttis's book . pop()不“调用析构函数”-它只是通过调用队列适配器的pop_front()从队列适配器的底层表示(默认为std::deque)中删除一个元素。如果要弹出的对象具有析构函数,则当弹出的对象超出范围时将使用它,但队列类与之无关。

        2
  •  37
  •   Greg Hewgill    14 年前

    指针 他们自己 实际上没有析构函数,所以调用 pop() 在包含指针的队列上,不会调用指针指向的对象的析构函数。

        3
  •  6
  •   Steve Jessop    14 年前

    “如何确保所有内容都已删除,并且内存释放正确?”

    如果您必须在队列中存储指针,并且希望在指针被释放时自动释放指针 pop 然后,您需要一个存储指针并在其析构函数中删除它的对象队列,而不是指针队列。例如,您可以使用共享的\u ptr队列。shared_ptr不在标准库中,但它是TR1的一部分,可以广泛使用。

    否则,调用者有责任删除对象:

    T *off = q.front();
    q.pop();
    delete off;
    

    总而言之,指向动态分配对象的指针容器有点笨拙。如果可以设计程序,使容器存储对象的副本,而不是指向动态对象的指针,那么就这样做。否则,您将负责资源所有权,而不是容器。STL容器对所有权一无所知,它们只是复制并销毁它们的 value_type . 复制和销毁指针对它们指向的对象没有任何作用。