动态数组:需要帮助将一个数组复制到另一个数组

时间:2016-02-24 02:10:28

标签: c++ arrays

我必须创建一个程序,使用'new'运算符在程序堆中创建动态数组。该程序为每个输入数据(cin)一次创建并填充其动态数组一(int)元素。

关键部分。

1。)程序必须使用“cin>>”数据输入一次接受整数,直到键盘上按下EOF(cntrl-z为Windows)。

2.)用户输入必须使用!cin.eof()&&amp ;; cin.good()测试是否按下了EOF键以及数据是否有效。 (有点对cin.good()部分感到困惑。)

3.)程序将创建一系列更长和更长的数组,以包含所有先前的元素和当前传入的元素。此外,程序将在完成当前版本后删除该阵列的先前版本。

4。)程序还测试每次使用new运算符后堆内存是否已耗尽。 (需要帮助)

我不断收到错误信息“HEAP CORRUPTION DETECTOR正常黑色(#146)”(视觉工作室)。有什么问题?

提前致谢!

以下是代码:

 #include <iostream> 
    #include <iomanip>
    #include <cstdlib>
    #include <cassert>
    using namespace std;
    // main
    int main() {
        int size = 2;
        int * array1 = new int[size];
        int arrayInput;
        int count = 0;
            do {
                if (array1 != NULL) {
                    cout << "Enter an integer (EOF to stop): " << endl;
                    cin >> arrayInput;
                    if (size < count) {
                        int * tempArray;
                        tempArray = new int[size * 2];
                        if (tempArray != NULL)
                        {
                            for (int i = 0; i < size; i++) {
                                array1[i] = tempArray[i];
                            }
                            delete[] array1;
                            array1 = tempArray;
                            size *= 2;
                            delete [] tempArray;
                        }
                        else
                            cout << "Insufficient Heap resource." << endl;  // If we get here the Heap is out of space
                    }
                    if (!cin.eof()) {
                        array1[count++] = arrayInput;
                    }
                }
                else
                    cout << "Insufficient Heap resource." << endl;  // If we get here the Heap is out of space
            } while (!cin.eof());
            for (int i = 0; i < count; i++) {
                cout << array1[i] << endl;
            }
    }

1 个答案:

答案 0 :(得分:1)

                    tempArray = new int[size * 2];

                    if (tempArray != NULL)
                    {
                        for (int i = 0; i < size; i++) {
                            array1[i] = tempArray[i];
                        }

您分配的新数组是旧数组的两倍。然后将新分配的数组的内容复制到现有数组中。新分配的数组包含随机垃圾,您刚刚用它来覆盖旧数组中现有的好数据。

这是一个明显的错误,但它无法解释崩溃。

                        delete[] array1;
                        array1 = tempArray;
                        size *= 2;
                        delete [] tempArray;

复制后,删除旧阵列。然后你也删除你刚刚分配的新数组。这闻起来像另一个臭虫,但它仍然不能解释崩溃。

                if (!cin.eof()) {
                    array1[count++] = arrayInput;
                }

现在,您可以在这里回答您自己的问题:当您继续写入指向您最近释放的内存的指针时会发生什么?

这是显示的代码中的多个错误。他们都必须修复。在此之后我还没有进一步观察。此代码可能还有其他问题。 rubber duck应该能够帮助您找到程序中任何剩余的错误。