-4

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

你期望'm_number = aArray;'做什么? – tkausl

+0

您用'new'分配'm_number',但在下一行重新分配给本地数组。 –

+0

这不仅是一个内存泄漏,但如果您稍后使用'm_number',它是未定义的行为 – NathanOliver

回答

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

0

你有记忆的经典场景泄漏。从本质上说你在做什么是以下几点:

  1. 分配内存(m_number = new unsigned char[4]
  2. 覆盖指向该分配的内存指针(m_number = aArray
  3. 决不删除分配的内存为您不再知道它在哪里 - 你已经失去了指针(它得到覆盖)
1

那行

m_number = aArray; 

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

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