我是指针和动态内存的新手。该程序应该是一个基于数组的堆栈。
当我尝试将内存分配给 .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;
}
为什么会出现此错误,我该如何解决?
最佳答案
这是您的代码在构造函数中执行的操作:
// 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
的代码没有做任何有用的事情,因为调用构造函数时 capacity 始终为零。如果您打算为此扩展现有的 CStack
,那么您需要将它放在一个方法中,并且需要担心为堆栈创建一个新数组,复制旧数组的内容插入新的,然后删除旧的。
关于c++ - 当我在 C++ 中创建指针数组时无法读取内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41887631/