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

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

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并观察这些手动内存管理问题。


那条线

m_number = aArray;

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

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


你有一个经典的内存泄漏情况 。 实质上你在做什么是以下几点:

  • 分配内存( m_number = new unsigned char[4]
  • 覆盖指向该分配内存的指针( m_number = aArray
  • 永远不要删除分配的内存,因为你不知道它在哪里 - 你已经失去了指向它的指针(它被覆盖)
  • 链接地址: http://www.djcxy.com/p/82815.html

    上一篇: Destructor not deleting allocated memory

    下一篇: C++ delete[] calls destructor