我是c ++的新手,我正面临访问冲突异常。 问题如下,我有backend.h文件,其中包含struct
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).
我认为问题与指针有关。 struct请帮帮我
答案 0 :(得分:4)
这个问题没有多大意义,它表明你应该从一本好的书或教程开始来理解基础知识(在头文件中声明变量可能不是一个好主意,函数声明是错误的标题),你使用的整个术语是奇怪的 ...
无论如何,就你现在的特定问题而言,最好的建议是在调试器中运行应用程序,你会看到发生了什么。我的第一个猜测(看一个水晶球)就是你在一个范围内创建一个Config
对象并且自动存储持续时间(Config config = get_config();
- 这个创建一个新对象当前范围是conf
对象的副本,然后获取指向它的指针(Config *g_config = &config;
- 指向当前范围内config
对象的指针,而不是全局{{1}然后,当对象已经被销毁时,然后传递并稍后在范围之外使用。
另一个选择是你面对初始化命令fiasco ,如果这两行不在上下文中,在这种情况下,你可能试图复制一个尚未初始化的conf
将对象转换为conf
。
config
本身是std::bad_alloc
无法分配内存时抛出的异常,如果系统资源不足(这可能不是问题)或者请求是不正确。
答案 1 :(得分:1)
如果您在标题中有此声明:
struct Config
{
....
}conf;
get_conf();
然后它可能相当于:
struct Config { ... } ;
Config conf;
int get_conf();
“很可能”,因为在C中省略了返回类型,暗示返回类型是int。在C ++中不是这种情况,但MSVC的编译器并不是那么标准的编译,所以它可能错过了,特别是。如果您禁用了警告。
如果是这样,这可能会导致声明
int get_conf();
与定义相关联:
Config get_conf() { ... }
源文件中的。如果这个链接,这样的调用会使你的程序崩溃。
答案 2 :(得分:0)
结构的构造可能存在一个问题,在编译时可能会出现故障,即在创建/初始化结构之前,您正在为指针分配一些地址。
因此,请确保所有GLOBAL数据创建/初始化都在同一个cpp编译单元中进行
答案 3 :(得分:0)
我没有编译器来确认,但这至少是问题的一部分。标头中定义的conf
将无效。如果你在两个cpp文件中使用了标题,你会得到重复的符号。
我猜想Kos为什么会得到你对seg故障做的消息是正确的。您可能会有一些警告(不要禁用它们)来确认这一点。
我的另一个猜测是它可能试图使用已声明但未初始化的变量。
这是我所期望的,假设您不想制作一堆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;