尝试增加数组大小时无法读取内存

时间:2018-11-11 10:16:46

标签: c++ arrays pointers

我试图理解指针,但是无法增加数组的大小,我试图做的是制作一个比标准数组大一个的数组,复制那里的所有内容,然后删除旧的指针数组,创建一个正确大小的新指针数组,然后从该临时数组移回所有内容。出于某种原因,我不断收到“无法读取内存”的信息,我也不知道为什么。

#include <iostream>

int main()
{
    int number;
    int arraySize = 3;
    bool full;
    int *ptr = new int[arraySize] {0};

do
{
    full = false;
    std::cout << "Input a number please: ";
    std::cin >> number;

    getchar();

    for (int i = 0; i < arraySize; i++)
    {
        if (ptr[i] == 0)
        {
            ptr[i] = number;
            i = arraySize;
        }
        else if(arraySize -1 == i)
        {
            full = true;
        }
    }
    if (full == true)
    {
        int *tempPtr = new int[arraySize+1];
        for (int x = 0; x < arraySize; x++ )
        {
            tempPtr[x] = ptr[x];

        }
        delete[] ptr;
        arraySize++;
        int *ptr = new int[arraySize];
        for (int x = 0; x < arraySize; x++)
        {
            ptr[x] = tempPtr[x];

        }
        ptr[arraySize] = number;

    }



}while(number != -1);
for (int z = 0; z < arraySize; z++)
{
    std::cout << ptr[z] << std::endl;
}

getchar();
return 0;

}

1 个答案:

答案 0 :(得分:0)

int *ptr = new int[arraySize];

ptr与外部ptr不同,因此超出范围时会泄漏。应该是

ptr = new int[arraySize];

此外,请不要忘记退出程序之前先delete[] ptr。这是一个稍作修改的版本,更易于i.m.o阅读。

#include <iostream>

int main()
{
    int number;
    int arraySize = 3;
    int *ptr = new int[arraySize] {0};
    int i=0;

    do
    {
        std::cout << "Input a number please: ";
        std::cin >> number;
        std::cin.ignore();
        if(number==-1) break; // no need to increase array

        if(i>=arraySize) {
            // the array is full
            int *tempPtr = new int[arraySize+1];
            for (int x = 0; x < arraySize; ++x) tempPtr[x] = ptr[x];
            delete[] ptr;

            // just assign the address tempPtr is pointing at to ptr
            ptr = tempPtr;
            ++arraySize;
        }
        // store the new number  
        ptr[i] = number;
        ++i;
    } while(true);

    for (int z = 0; z < i; z++)
    {
        std::cout << ptr[z] << std::endl;
    }
    delete[] ptr;

    getchar();
    return 0;
}

请注意,有一些标准容器(std :: vector等)比动态容器更有效地处理动态分配,因此您不必自己编写它。