访问违规C ++

时间:2011-09-03 16:15:08

标签: c++ visual-studio visual-studio-2010 pointers

我是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请帮帮我

4 个答案:

答案 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;