嗨,我是指针和动态内存的新手。该程序应该是基于数组的堆栈。
我需要帮助解决当我尝试将内存分配给.h文件中名为_pArr的指针变量时发生的错误。当我尝试使用new double[]
创建一个新数组时,我在调试代码时收到“无法读取的内存”错误消息。
在下面的代码中,我在.cpp文件中创建了一个新数组,然后将其复制到_pArr
指针,但我仍然得到相同的错误。
class CStack{
public:
Stack(void);
~Stack(void);
.
.
.
private:
int _capacity=NULL;
int _size=0;
double* _pArr;
}
CStack::CStack(void)
{
if (_capacity == 0){
_capacity = 10;
}
else{
_capacity = _capacity * 2;
}
double* arr;
arr = new double [_capacity]
_pArr=arr;
delete[] arr;
}
为什么会出现此错误,我该如何解决?
答案 0 :(得分:2)
这是您的代码在构造函数中执行的操作:
// Allocate memory for an array and set arr to point to that array.
double* arr;
arr = new double [_capacity]
// Set _pArr to point to the same array.
_pArr=arr;
// Delete the array that arr and _pArr point to. If you
// deference _pArr after this, bad things will happen.
delete[] arr;
因此,在分配数组后,您不应立即删除该数组。 (那里还有一个缺少的分号。)摆脱它可能会解决你的问题,但是然后你需要删除类的析构函数中的数组。如果你必须使用new[]
/ delete[]
,那么只需一步就可以做到这一点,而不是创建一个无用的临时变量:
CStack::CStack(void)
{
if (_capacity == 0){
_capacity = 10;
}
else{
_capacity = _capacity * 2;
}
_pArr = new double [_capacity];
}
CStack::~CStack(void)
{
delete[] _pArr;
}
与您的问题无关,但是那个加倍_capacity
的代码并没有做任何有用的事情,因为在调用构造函数时,容量将始终为零。如果您打算扩展现有的CStack
,那么您需要将它放在一个方法中,并且需要担心为堆栈创建一个新数组,将旧数据的内容复制到新数组中。 ,然后删除旧的。