c++ - 当我在 C++ 中创建指针数组时无法读取内存

标签 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;
}

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

最佳答案

这是您的代码在构造函数中执行的操作:

// 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/

相关文章:

c++ - 在 C++ 中获取类成员的大小

c++ - 如何保证 API 在异步 API 中调用其回调之前返回 (c++)

c - printf 不工作(指针)

c++ - 如何复制具有嵌套类(包含指向外部类的指针成员)的类的实例?

c++ - 通过 C++ 中的构造函数初始值设定项列表初始化私有(private)成员数组

c++ - 在 C++ 上忽略间距的最有效方法?

c++ - 智能指针与拥有原始指针

c++ - 错误 : Total size of array must not exceed 0x7fffffff bytes

javascript - 由于帧导致的 addEventListener 内存泄漏

python 内存错误