C++讀取訪問權限沖突引發異常問題的原因分析

用C++寫代碼時經常會遇到“引發瞭異常: 讀取訪問權限沖突。”這樣的錯誤提示,這種情況產生原因主要有兩點:

一、訪問數組越界

當采用線性表的順序結構,例如順序表、隊列、棧等,用數組存儲數據時,若將要讀取數據的位置超出瞭當前數組的長度,就會發生數組訪問越界的狀況。

可這並不會造成編譯錯誤,也就是說,編譯器並不會在你編譯的時候就指出你訪問數組越界瞭,這個時候可能還是“0 errors,0 warnings”

你還在暗暗慶幸自己的代碼沒有bug,但是當你運行之後就會拋出訪問權限沖突的異常。

例如:下面這段對隊列和棧的操作

struct Stack              //這裡定義瞭一個棧的結構
{
	int data[maxSize];    //定義存儲棧中元素的數組
	int top;              //定義棧頂指針
};
struct Queue              //這裡定義瞭一個隊列的結構
{
	int elements[2000];   //定義一個長度為2000的數組存放隊列中的元素
	int front;            //定義隊頭指針
	int rear;             //定義隊尾指針
};
while (queueA->front < queueA->rear || queueB->front < queueB->rear) 
{
	queueA->front++;
	inStack(stack, queueA->elements[queueA->front]);
	outStack(stack, queueA);
	queueB->front++;
	inStack(stack, queueB->elements[queueB->front]);
	outStack(stack, queueB);
}
//inStack函數實現出隊後進棧操作
//outStack函數實現出棧後入隊操作,入隊後隊尾指針後移

編譯成功沒有報錯,但是運行後拋出瞭讀取訪問權限沖突的異常

我們查看此時局部變量的狀態可以發現,隊列A 的隊頭指針和隊尾指針都指向瞭異常的下標

這顯然發生瞭訪問越界的情況,因為長度為2000的數組,下標的取值應該是0~1999。

後來,發現錯誤出在while循環判定的條件。本意上是當A、B之間任意一個隊列中的元素為空的時候就跳出循環,但是錯將判定條件中的邏輯且寫成瞭邏輯或,導致遲遲不能跳出循環,最終隊列A的隊頭指針和隊尾指針在不斷的循環操作中超出瞭數組邊界,發生瞭讀取訪問權限沖突的異常。

將while的判定條件修改後,程序可正常運行。

所以遇到讀取訪問權限沖突的提示,如果異常發生在讀取數組中數據的時候,可以優先考慮是否是因為某種操作不當導致訪問數組越界瞭。

二、空指針異常

這主要發生在通過指針讀取數據時,比如在使用鏈表的過程中。

示例:鏈表中的操作

struct Node              //這裡定義瞭一個結點
{
	int data;
	Node* next;
};
LinkListInvert::LinkListInvert(int arg[],int n)
{                            //重載構造函數對鏈表進行初始化
	Node* r = first;
	Node* s = nullptr;
	for (int i = 0; i < n; i++)
	{
		s = new Node;
		s->data = arg[i];
		r->next = s;
		r = s;
	}
	r->next = nullptr;
}

代碼編譯無錯誤,運行後發生讀取訪問權限異常

這裡不難看出是因為沒有初始化first指針,使得first指針成為瞭一個空指針,指向瞭一個不確定的值,隨後進行的操作

	Node* r = first;

使r指針也成為瞭一個空指針,在進行接下來的操作時就拋出瞭讀取權限沖突的異常。

LinkListInvert::LinkListInvert(int arg[],int n)
{
	first = new Node;           //此處為修改的地方,對first初始化
	Node* r = first;
	Node* s = nullptr;
	for (int i = 0; i < n; i++)
	{
		s = new Node;
		s->data = arg[i];
		r->next = s;
		r = s;
	}
	r->next = nullptr;
}

而修改的方式也很簡單,對first指針進行初始化後即可運行成功。

類似的,由指針未初始化而引發的讀取訪問權限異常,還會給出諸如 0XCCCCCCCC、0xCDCDCDCD的異常提示。

當然,不止鏈表,空指針異常還會出現在很多其他情況下,比如在數據庫查詢,指針未初始化時也會產生空指針異常。

總結

到此這篇關於C++讀取訪問權限沖突引發異常問題的文章就介紹到這瞭,更多相關C++讀取訪問權限沖突內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: