簡體   English   中英

訪問沖突C ++

[英]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.

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