代码之家  ›  专栏  ›  技术社区  ›  Nima

删除对象

  •  5
  • Nima  · 技术社区  · 16 年前

    Object* object = new Object(...);
    ...
    
    delete object;
    

    或者

    object->~Object();
    

    第二,delete操作符是否隐式调用析构函数?

    10 回复  |  直到 11 年前
        1
  •  13
  •   Tony the Pony    16 年前

    delete 隐式地调用析构函数,您不需要(更确切地说:不应该)直接调用它。

    为了释放在堆上分配的对象的内存,必须调用 删除

    缺省析构函数 释放由组件对象(如 QString 但如果在构造函数中显式分配内存(或其他资源),请确保提供一个析构函数来显式释放这些资源。

    关于您自己的类的另一个一般规则:如果您标记任何方法 virtual ,你的析构函数应该是 ,以便为从您的类派生的任何类调用正确的析构函数。

        2
  •  7
  •   CB Bailey    16 年前

    我两个都不喜欢。

    只有在将内存分配与对象生存期分离时,才非常、非常罕见地需要显式析构函数调用。如果实现自定义容器类,可能需要它。

    明确的 delete new

    {
        // ...
        Object object( ... );
    
    } // object destructor run, however this block is exited.
    

    std::auto_ptr 它可以用于块范围的动态分配对象,但在复制和分配时具有“令人惊讶”的行为。像这样的 tr1::shared_ptr (或 boost::shared_ptr

    {
        std::auto_ptr<Object> object(new Object(...));
        // ...
    } // *object destructor run, however this block is exited.
    
        3
  •  4
  •   Amardeep AC9MF    16 年前

    首选删除。仅仅调用析构函数并不能释放新函数分配的内存。

        4
  •  4
  •   M. Williams    16 年前

    delete . 它调用对象 析构函数

    而且,它不是解构器,而是解构器。

        5
  •  4
  •   Carl Norum    16 年前

    通常你不想显式调用析构函数。只是使用 delete

        6
  •  4
  •   ChrisW    16 年前

    调用delete将调用析构函数,然后释放内存。

    显式调用析构函数只会调用析构函数,而不会释放内存。

    placement new .

        7
  •  2
  •   Philippe Leybaert    16 年前

    你不应该自己给毁灭者打电话。 我会帮你叫的

        8
  •  2
  •   Konrad Rudolph    16 年前

    需要考虑的其他事项:

    自从 delete ,即调用析构函数,然后删除。所以下面的代码:

    Foo* px = new Foo;
    // …
    px->~Foo();
    delete px;
    

        9
  •  1
  •   Cade Roux    16 年前
        10
  •  0
  •   Spiderman    12 年前

    当您使用动态内存分配来创建对象时,您可以使用delete操作符来销毁/删除对象,但当您当时不使用DMA时,尝试使用delete操作符删除对象会引发错误。处理这种情况的一种方法是,显式编写自己的析构函数,并使用对象调用析构函数来销毁它。