簡體   English   中英

引發未處理的異常:在簡單的 c++ 程序中讀取訪問沖突,該程序動態增加數組長度以存儲數字

[英]Unhandled exception thrown: read access violation in simple c++ program that dynamically increase the array length to store numbers

我正在做一個 c++ 分配,允許用戶一個一個地輸入數字然后存儲在一個數組中,並動態增加這個數組的容量(乘以 2)。 基本上是使用一些基本代碼來模仿“向量”。

#include<iostream>
using namespace std;

struct myArray {
    const size_t initial_size = 1;
    const size_t growth_factor = 2;
    size_t length = 0;
    size_t capacity = initial_size;
    int *v; // vector
};

int main() {
    int x; 
    myArray numbers;

    while (true) {
        cout << "Please input a numebr (program terminated once a -ve number is entered)" << endl;
        cin >> x;
        if (x < 0) 
            break;

        if (numbers.length == numbers.capacity) {
            int *temp = new int[numbers.capacity *= numbers.growth_factor];
            for (size_t i = 0; i < numbers.length; ++i)
                temp[i] = numbers.v[i];
            delete[] numbers.v;
            numbers.v = temp;
        }
        numbers.v[numbers.length++] = x;
    }

    for (size_t i = 0; i < numbers.length; ++i) 
        cout << numbers.v[i] << ",";

    cout << endl;

    return 0;
}

這是我得到的錯誤,我的第 33 行代碼旁邊有一個小紅叉: numbers.v[numbers.length++] = x; 當我 hover 越過紅十字時,這是錯誤:錯誤消息圖片

Exception thrown: read access violation.
numbers.v was 0x111011101110111. occurred

通過查看我的代碼行,我只是將 int 值“x”分配給數組“numbers.v”的第一個元素

我已經嘗試尋找其他解決方案,但是我發現其他人的問題要先進得多,並且在不同情況下,這種讀取訪問沖突錯誤似乎是由於不同的原因造成的。

當你這樣做時:

int *v;

您正在創建一個指向 int 的指針,但到目前為止它只指向未確定的 memory。 因此,即使嘗試訪問v[0]也是未定義的行為,並且可能引發讀取訪問沖突。 initial_size不正確。 v一開始沒有任何元素,因此v.length將在循環的第一次迭代中返回0並且if語句將評估為 false。 然后你會嘗試訪問

 numbers.v[numbers.length++] = x;

這是未定義的行為。

您應該以一個元素開始v ,以便v的起始大小正確:

int* v = new int[1];

另外不要忘記在最后釋放 memory 以避免 memory 泄漏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM