析构函数不删除已分配的内存

时间:2017-02-16 19:50:01

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

我有一个包含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;
}

3 个答案:

答案 0 :(得分:2)

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并注意这些手动内存管理问题消失了。

答案 1 :(得分:1)

那一行

m_number = aArray;

将本地变量的地址分配给m_number

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

答案 2 :(得分:0)

您有内存泄漏的经典场景。实质上你正在做的是:

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