【问题标题】:Pointer to object and its destructor指向对象及其析构函数的指针
【发布时间】:2012-04-15 11:54:51
【问题描述】:
class finder
{
    public:
        finder();
        ~finder();
}

int _tmain(int argc, _TCHAR* argv[])
{
    finder* pfind = new finder(L"test");
    finder find(L"test2");
    system("PAUSE");
    return 0;
}

我知道find的析构函数会在程序退出后被调用,而pfind的析构函数不会被调用。我的问题是为什么?我应该添加

delete _pfind;

在返回 0 之前?

【问题讨论】:

  • 你不应该添加delete,你应该删除new
  • 你的代码充满了错误;如果您要发布 sn-ps,您应该尽量使它们尽可能正确。
  • @avakar 了解newdelete 并没有错。当然,如果您不喜欢它们,您可以找到避免它们的方法,但是实际使用它们并适应它们并从错误中吸取教训并决定您是否喜欢它们并没有错。

标签: c++ pointers destructor delete-operator


【解决方案1】:

“为什么”是因为您负责管理使用 new 创建的对象的生命周期。

该语言表示具有自动存储持续时间的对象(例如您的示例中的find)与创建它们的块一样长。这些会在适当的时间(即通常在您离开该块时)自动删除(您不能自己做)。

动态存储持续时间对象(例如 pfind 指向的对象)会持续到您删除它们为止。什么都不会为您删除它们。

所以是的,在这种情况下您需要自己删除它,使用delete pfind;

(或为您的用例使用适当类型的智能指针。)

【讨论】:

    【解决方案2】:

    是的,您应该通过在非托管指针上调用 delete 来显式清理分配的内存。通常,通过new 分配内存的任何代码块都必须由通过delete 释放该内存的代码块来平衡。

    【讨论】:

      【解决方案3】:

      Mat 是对的,但是我注意到您使用的是 CLR/.Net C++(或者他们现在所说的任何东西)。我相信这带有一个gcnew 关键字,它将与new 关键字执行相同的操作,但会在其范围末尾删除对象。这也称为垃圾收集。就个人而言,同时拥有newgcnew 是一个很好的工具,因为它们都非常适合不同的情况。请记住,如果您使用 gcnew,您的代码将不会是跨平台的。

      【讨论】:

        猜你喜欢
        • 2021-07-25
        • 2019-06-20
        • 1970-01-01
        • 2012-10-12
        • 2018-03-07
        • 1970-01-01
        • 2011-11-12
        • 2018-04-06
        • 2013-10-19
        相关资源
        最近更新 更多