1. 程式人生 > >0x00007FF7C49A4C42 處有未經處理的異常:0xC0000005: 讀取位置 0x000001481A2D86C4 時發生訪問衝突

0x00007FF7C49A4C42 處有未經處理的異常:0xC0000005: 讀取位置 0x000001481A2D86C4 時發生訪問衝突

這個問題我最近遇到過幾次,主要是在做特徵點檢測,或者有用到有陣列或者向量的情況下,有可能會出現這種情況,可能出現這種問題的情況有很多,我現在說一下我發現的問題:
這幾次出現這種問題基本都是溢位問題,比如一個向量他的大小為500,而你在訪問的時候卻訪問了他的第501個元素,就會出現這種問題,但是這種問題比較難發現,因為程式寫的沒有問題,但是就是會蹦出來這種問題呀,我當時是一個一個去試,由於程式比較大,我會重新建立一個工程,然後把這個程式簡化掉,然後再去找問題。下面我來舉個栗子:

    vector<Vec4i> m1,m2;//建立兩個向量
    m1.push_back(Vec4i(1
, 2, 3, 4));//往向量裡面加入資料 m1.push_back(Vec4i(3, 5, 8, 7)); m1.push_back(Vec4i(2, 8, 9, 7)); m2.push_back(Vec4i(1, 9, 6, 17));//同理 m2.push_back(Vec4i(37,45,126,32)); m2.push_back(Vec4i(4,5,96,21)); vector<double>distance;//同理 distance.push_back(2.236); distance.push_back(1.732
); distance.push_back(2); distance.push_back(0.2358); distance.push_back(0.001); std::vector<double>::iterator minest = min_element(begin(distance),end(distance)); int position = std::distance(std::begin(distance), minest);//找出distance向量中最小的元素所在的位置 int nnn = m1[0][3] - m2[position][3
];

最開始的時候出現這個問題是下面這句程式碼:

int nnn = m1[0][3] - m2[position][3];

我寫了個很簡單的例子,distance向量中最小的元素的位置是4,在這句程式碼中,我們訪問m2向量時m2[position][3],也就是訪問m2[4][3],但是實際上m2是沒有第四行的,這個時候就會造成訪問越界,就會出現讀取位置是發生訪問衝突。但是在實際執行中,nnn的值可能是隨機的,這都有可能。