std :: list :: remove方法调用每个被删除元素的析构函数吗?

std::list<Node *> lst;
//....
Node * node = /* get from somewhere pointer on my node */;
lst.remove(node);

std :: list :: remove方法调用每个被删除元素的析构函数(和可用内存)吗? 如果是,我该如何避免它?


是的,从容器中移除Foo*破坏了Foo* ,但它不会释放Foo 。 销毁原始指针始终是无操作的。 它不能以任何其他方式! 让我给你几个原因。

存储类

只有在指针被实际动态分配的时候删除一个指针才有意义,但是当指针变量被销毁时,运行时怎么可能知道这种情况? 指针还可以指向静态变量和自动变量,并删除其中的一个会产生未定义的行为。

{
    Foo x;
    Foo* p = &x;

    Foo* q = new Foo;

    // Has *q been allocated dynamically?
    // (The answer is YES, but the runtime doesn't know that.)

    // Has *p been allocated dynamically?
    // (The answer is NO, but the runtime doesn't know that.)
}

摇晃的指针

没有办法确定指出者是否已经被释放了。 两次删除相同的指针会产生未定义的行为。 (在第一次删除后它变成了一个悬挂指针。)

{
    Foo* p = new Foo;

    Foo* q = p;

    // Has *q already been released?
    // (The answer is NO, but the runtime doesn't know that.)

    // (...suppose that pointees WOULD be automatically released...)

    // Has *p already been released?
    // (The answer WOULD now be YES, but the runtime doesn't know that.)
}

未初始化的指针

检测指针变量是否已经被初始化也是不可能的。 猜猜当你试图删除这样一个指针会发生什么? 再一次,答案是未定义的行为。

    {
        Foo* p;

        // Has p been properly initialized?
        // (The answer is NO, but the runtime doesn't know that.)
    }

动态数组

类型系统不区分指向单个对象( Foo* )的指针和指向对象数组的第一个元素(也是Foo* )的指针。 当一个指针变量被销毁时,运行时不可能通过delete或者通过delete[]找出是否释放指针。 通过错误的表单发布调用未定义的行为。

{
    Foo* p = new Foo;

    Foo* q = new Foo[100];

    // What should I do, delete q or delete[] q?
    // (The answer is delete[] q, but the runtime doesn't know that.)

    // What should I do, delete p or delete[] p?
    // (The answer is delete p, but the runtime doesn't know that.)
}

概要

由于运行时无法对指针进行任何操作,因此销毁指针变量始终是空操作。 无所作为肯定比导致未定义的行为更好,因为不知情的猜测:-)

忠告

考虑使用智能指针作为容器的值类型,而不是原始指针,因为它们负责在不再需要时释放指针。 根据您的需要,使用std::shared_ptr<Foo>std::unique_ptr<Foo> 。 如果您的编译器不支持C ++ 0x,请使用boost::shared_ptr<Foo>

永远,我再说一遍, 永远不要使用std::auto_ptr<Foo>作为容器的值类型。


它调用list中每个项目的析构函数 - 但这不是一个Node对象。 它是一个Node*

所以它不删除Node指针。

那有意义吗?


它调用列表中数据的析构函数。 这意味着, std::list<T>::remove将调用T的析构函数(当Tstd::vector时,这是必需的)。

在你的情况下,它会调用Node*的析构函数,这是一个无操作。 它不调用node的析构函数。

链接地址: http://www.djcxy.com/p/72981.html

上一篇: Does std::list::remove method call destructor of each removed element?

下一篇: Understanding the meaning of the term and the concept