析构函数不删除分配的内存
Destructor not deleting allocated memory
我有一个 class,其中包含一个 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 = new unsigned char[4]
)
- 覆盖指向该分配内存的指针 (
m_number = aArray
)
- 从不 删除分配的内存,因为您不再知道它在哪里 - 您丢失了指向它的指针(它被覆盖)
那一行
m_number = aArray;
将局部变量的地址分配给 m_number
。
该地址不能与delete [] m_number;
一起使用,用new unsigned char[4]
分配的内存地址在分配后被覆盖并丢失。
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
并观察这些手动内存管理问题消失。
我有一个 class,其中包含一个 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 = new unsigned char[4]
) - 覆盖指向该分配内存的指针 (
m_number = aArray
) - 从不 删除分配的内存,因为您不再知道它在哪里 - 您丢失了指向它的指针(它被覆盖)
那一行
m_number = aArray;
将局部变量的地址分配给 m_number
。
该地址不能与delete [] m_number;
一起使用,用new unsigned char[4]
分配的内存地址在分配后被覆盖并丢失。
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
并观察这些手动内存管理问题消失。