Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 析构函数不删除分配的内存_C++_Memory Management_Destructor_New Operator_Delete Operator - Fatal编程技术网

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

C++ 析构函数不删除分配的内存,c++,memory-management,destructor,new-operator,delete-operator,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_sizeR

我有一个包含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=新的无符号字符[4] 重写指向已分配内存m_number=aArray的指针 永远不要删除分配的内存,因为您不再知道它在哪里-您丢失了指向它的指针,它被覆盖了 那条线

m_number = aArray;
将局部变量的地址分配给m_编号

该地址不能与delete[]m_number;一起使用;,使用新的无符号字符[4]分配的内存地址在分配之后被覆盖并丢失。

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

m_number=newunsigned char[4]现在在堆上创建4个元素。你分配内存,你将负责清理它。这不是问题,您可以在析构函数中执行

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

在这个构造函数之外使用m_number现在是未定义的行为,因为您正在访问不再拥有的内存

删除[]m_编号;现在您正在删除您不拥有的内存。乌兰巴托


不要重新分配m_编号,您将不会遇到这些问题。更好的方法是,使用并观察这些手动内存管理问题逐渐消失。

你对m_number=aArray有什么期望;该怎么办?您使用new分配m_编号,但在下一行您将其重新分配给本地数组。这不仅是内存泄漏,而且是未定义的行为,如果您以后使用m_编号,您的意思是什么?我遇到的问题是,出现了编译器错误,并声明未分配内存?你怎么看?