在c ++中创建指针数组时内存不可读

时间:2017-01-27 05:44:44

标签: c++ pointers memory dynamic data-structures

嗨,我是指针和动态内存的新手。该程序应该是基于数组的堆栈。 我需要帮助解决当我尝试将内存分配给.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;
}

为什么会出现此错误,我该如何解决?

1 个答案:

答案 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,那么您需要将它放在一个方法中,并且需要担心为堆栈创建一个新数组,将旧数据的内容复制到新数组中。 ,然后删除旧的。