[英]Access Violation C++
我是c ++的新手,並且面臨訪問沖突異常。 問題如下,我有包含結構的backend.h文件
struct Config
{
....
}conf;
get_conf();
backend.cpp中的實現
Config get_conf()
{
return conf;
}
backend.cpp和backend.h會被編譯和生成以生成dll。 這樣,該dll包含在VS解決方案中
Config config = get_config();
Config *g_config = &config;
代碼可以編譯並正常運行,但是在調用函數時會引發異常
First-chance exception at 0x75d6d36f in BA.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x002ec494..
First-chance exception at 0x75d6d36f in BA.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x002ebe28..
First-chance exception at 0x75d6d36f in BA.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
First-chance exception at 0x77962d37 in BA.exe: 0xC0000005: Access violation reading location 0x41ce5ab2.
Unhandled exception at 0x77962d37 in BA.exe: 0xC0000005: Access violation reading location 0x41ce5ab2.
The program '[4624] BA.exe: Native' has exited with code -1073741819 (0xc0000005).
我認為問題與指針和結構有關,請幫幫我
這個問題沒有多大意義,它表明您可能應該從一本好書或教程入手,以了解基礎知識(在頭文件中聲明變量可能不是一個好主意,函數聲明在頭文件中是錯誤的) ,您使用的整個術語很奇怪 ...
無論如何,就您現在遇到的特定問題而言,最好的建議是在調試器中運行該應用程序,然后您將了解發生了什么。 我的第一個猜測(看一個水晶球)是您正在創建一個在范圍內具有自動存儲持續時間的Config
對象( Config config = get_config();
這將在當前范圍內創建一個新對象,該對象是conf
對象),然后獲取指向它的指針( Config *g_config = &config;
-指向當前作用域中的config
對象的指針,而不是全局conf
),然后您將其傳遞給對象,然后在該對象已經存在時在范圍之外使用被摧毀了。
另一個選擇是,如果這兩行不在上下文中,則面臨初始化順序的失敗 ,在這種情況下,您可能試圖將尚未初始化的conf
對象復制到config
。
std::bad_alloc
本身是一個異常,當new
無法分配內存時會引發該異常,並且如果系統資源不足(這里可能不是問題)或請求不正確,則可能發生此異常。
如果標題中有以下聲明:
struct Config
{
....
}conf;
get_conf();
那么它可能等效於:
struct Config { ... } ;
Config conf;
int get_conf();
“可能”,因為在C中省略返回類型意味着返回類型為int。 在C ++中不是這種情況,但是MSVC的編譯器並不是真正符合標准的,因此可能會錯過,尤其是。 如果您禁用了警告。
如果是這樣,可能會導致聲明
int get_conf();
與定義鏈接:
Config get_conf() { ... }
在源文件中。 如果此鏈接鏈接,則此類調用將使您的程序崩潰。
一個問題可能是結構的構造,在編譯時可能不合時宜,即在創建/初始化結構之前,正在為指針分配一些地址。
因此,請確保所有GLOBAL數據創建/初始化都在同一cpp編譯單元中進行
我沒有編譯器可以確認,但這至少是問題的一部分。 標頭中定義的conf
無效。 如果在兩個cpp文件中使用了標頭,則會得到重復的符號。
我猜想Kos是正確的,為什么您會收到關於段錯誤的消息。 您可能會有一些警告(請勿禁用它們)可以確認這一點。
我的另一個猜測是,它可能正在嘗試使用已聲明但未初始化的變量。
假設您不想制作Config
對象的一堆副本,這就是我所期望的。
// .h
struct Config
{
// ...
};
Config &get_conf();
// .cpp
Config &get_conf()
{
static Config conf;
return conf;
}
// some other file
Config &conf = get_conf();
conf.value = 5;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.