【问题标题】:destructor not executing in C++析构函数不在 C++ 中执行
【发布时间】:2016-10-10 20:33:27
【问题描述】:

我有以下代码。

#include <string.h>
#include <iostream>

using namespace std;

class Fred
{
    private:
        char* _cptr;

    public:

        Fred()
        {
            _cptr = new char[strlen("Hello World") + 1];
            strcpy(_cptr, "Hello World");
        }

        ~Fred()
        {
            cout << "Fred::~Fred(): " << _cptr << endl;
            delete _cptr;
        }

        void Display() const
        {
            cout << "Fred::Display() _cptr: " << _cptr << endl;
        }
};

int main()
{
    Fred* p = new Fred();
    if (p == NULL)
        cout << "fail" << endl;
    p->Display() ;

    p = NULL;
    delete p;

    getchar();
    return 0;
}

输出 Fred::Display() _cptr: Hello World 009A02D8

int main()
{
    Fred* p = new Fred();
    if (p == NULL)
        cout << "fail" << endl;
    p->Display() ;

    //p = NULL;
    delete p;

    getchar();
    return 0;
}

输出 Fred::Display() _cptr: Hello World Fred::~Fred(): Hello World

关于为什么析构函数在 First Case(p = NULL) 中不起作用的任何想法。

谢谢 地图

【问题讨论】:

  • 切换这些行:p = NULL; delete p; delete NULL; 是一个 NOP,您正在泄漏原始实例。
  • 为什么会这样?你没有删除new返回的指针。
  • 不同意“关闭为拼写错误”的投票 - 在我看来,OP 故意以这种方式编写代码并且不理解它的含义
  • @M.M 正如 @Baum 所说。这是微不足道的。
  • @πάνταῥεῖ 但这不是“无法再重现的问题”,也不是“简单的印刷错误”。

标签: c++ c++11 memory-management


【解决方案1】:

在第一种情况下,您从未删除new Fred() 分配的对象。

在删除对象之前将p 设置为空指针。该对象仍然存在,只是没有指向它的指针。名称p 不再以任何方式与该对象关联。然后delete p; 什么都不做,因为删除空指针被定义为什么都不做。

【讨论】:

    【解决方案2】:

    考虑第一种情况下的流程:

    1. 您使用 new 运算符分配 Fred 的新实例
    2. 你用它调用一些方法(与问题无关)。
    3. 您将NULL 分配给指针,实际上丢失了您创建的对象。
    4. 您在 NULL 指针上运行 delete

    由于delete 未在有效对象上运行,因此无法调用析构函数。

    【讨论】:

      猜你喜欢
      • 2016-04-20
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 2017-12-01
      • 2015-08-02
      • 2012-01-08
      相关资源
      最近更新 更多