【问题标题】:Destructor not deleting allocated memory [closed]析构函数不删除分配的内存[关闭]
【发布时间】:2017-07-06 02:50:01
【问题描述】:

我有一个包含 std::uint_8 指针的类,应该调用析构函数来删除分配的内存。我遇到的问题是发生编译器错误并声明内存未分配,但我知道我在默认构造函数中分配了它。 这是我的默认构造函数:

BigInteger::BigInteger() {
  unsigned char aArray [4];
  aArray[0] = 0;
  m_number = new unsigned char[4]
  m_number = aArray;
  m_digitCount = 0;
  m_sizeReserved = 4;
}

这是我的析构函数:

BigInteger::~BigInteger() {
    delete [] m_number;
}

【问题讨论】:

  • 你希望m_number = aArray; 做什么?
  • 您将m_number 分配给new,但在下一行您将其重新分配给本地数组。
  • 如果您稍后使用m_number,这不仅是内存泄漏,而且是未定义的行为
  • “我遇到的问题是发生编译器错误并声明内存未分配”是什么意思?你怎么看?

标签: c++ memory-management destructor new-operator delete-operator


【解决方案1】:

unsigned char aArray [4] 在这里,您在堆栈上创建了一个包含 4 个元素的数组。一旦构造函数完成,这些将超出范围。

m_number = new unsigned char[4] 现在你在堆上创建了 4 个元素。你分配内存,你将负责清理它。没问题,你可以在析构函数中这样做。

m_number = aArray; 现在您更改了m_number 指向的内容,实际上丢失了指向您分配的内存的指针。现在你有一个泄漏。

在此构造函数之外对m_number 的任何使用现在都是未定义的行为,因为您正在访问您不再拥有的内存。

delete [] m_number; 现在你正在删除不属于你的内存。 UB。

不要重新分配m_number,您就不会遇到这些问题。更好的是,使用 std::vector 并观察这些手动内存管理问题会消失。

【讨论】:

    【解决方案2】:

    那行

    m_number = aArray;
    

    将局部变量的地址分配给m_number

    该地址不能与delete [] m_number; 一起使用,分配给new unsigned char[4] 的内存地址在分配后被覆盖并丢失。

    【讨论】:

      【解决方案3】:

      您有一个典型的内存泄漏场景。本质上,您正在做的事情如下:

      1. 分配内存 (m_number = new unsigned char[4])
      2. 覆盖指向已分配内存的指针 (m_number = aArray)
      3. 永远不要删除分配的内存,因为您不再知道它在哪里 - 您丢失了指向它的指针(它已被覆盖)

      【讨论】:

        猜你喜欢
        • 2017-05-08
        • 2016-02-16
        • 1970-01-01
        • 2021-07-16
        • 2013-10-04
        • 1970-01-01
        • 1970-01-01
        • 2014-06-28
        • 2021-01-15
        相关资源
        最近更新 更多