![](/img/trans.png)
[英]Unhandled exception Access violation writing location 0xCDCDCDCD - in Structure C++
[英]C++ ODBC Unhandled exception / Access violation writing location
我正在編寫一個ODBC數據庫類,其中包含一個成員函數,該成員函數用於從給定查詢中獲取一系列屬性和元組。
我在下面的語句中只有一行代碼,這會導致在調試模式下引發此運行時錯誤:
Unhandled exception at <mem loc> in <prog name>: 0xC0000005: Access violation writing location <mem loc>.
這是ERROR
指出違規行的代碼:
SQLINTEGER length = 0;
vector<vector<string>> data;
this->sReturn = SQLFetch(this->sHandle);
while (this->sReturn == SQL_SUCCESS) {
vector<string> tuple;
for (int i = 0; i < columnCount; i++) {
SQLPOINTER value = "";
switch (info[i].columnType) {
case 0 : //SQL_UNKNOWN_TYPE
throw DatabaseAttributeTypeUnknown("The database returned an attribute of an unknown type.");
break;
case 1 : //SQL_CHAR
this->sReturn = SQLGetData(this->sHandle, i + 1, info[i].columnType, value,
info[i].columnSize*sizeof(SQLCHAR),
ERROR &length);
break;
//Some more cases
}
}
為什么會引發此錯誤的任何想法? 這是有關SQLGetData()的MSDN文檔 ,該文檔正在將一個值分配給length
。
感謝您的時間。
當編譯器將可執行代碼映射到源代碼中的代碼行時,它們通常無法區分分成多行的語句中的行。 因此,如果調試器說某個錯誤發生在特定的行上,則它實際上可能在整個語句中的任何位置,因此在以下位置:
this->sReturn = SQLGetData(this->sHandle, i + 1, info[i].columnType, value,
info[i].columnSize*sizeof(SQLCHAR),
&length);
這里唯一的搖晃指針value
,其指向一個空靜態字符串,所以要一個一個字符長陣列包含一個空字節。 同樣,根據編譯器選項,此數組可以位於數據的只讀段中。 盡管SQLGetData()認為它指向的位置至少為info[i].columnSize*sizeof(SQLCHAR)
個字節,並且它將在其中寫入(不讀取)SQL列中的數據。
我可能會錯過其他細節,但是我的第一個猜測是導致內存訪問沖突的原因。
除了弗雷德里克所說的。 您是否在編譯64位代碼? 如果是這樣,您會發現SQLGetData使用指向最后一個參數而不是SQLINTEGER的SQLLEN的指針:
SQLRETURN SQL_API SQLGetData(SQLHSTMT StatementHandle,
SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType,
SQLPOINTER TargetValue, SQLLEN BufferLength,
SQLLEN *StrLen_or_Ind);
在64位窗口中,SQLLEN是8個字節,而不是SQLINTEGER是4個字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.