Нарушение доступа C ++ - PullRequest
       1

Нарушение доступа C ++

0 голосов
/ 03 сентября 2011

Я новичок в c ++ и сталкиваюсь с исключением Access Violation. Проблема заключается в следующем, у меня есть файл 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).

Я думаю, что проблема связана с указателями и структурой, пожалуйста, помогите мне

Ответы [ 4 ]

4 голосов
/ 03 сентября 2011

Вопрос не имеет особого смысла, и это означает, что вам, вероятно, следует начать с хорошей книги или учебника, чтобы понять основы (объявление переменной в заголовочном файле, вероятно, не очень хорошая идея, объявление функции неверно в заголовок), вся терминология, которую вы используете: странно ...

В любом случае, что касается вашей конкретной проблемы, лучший совет - запустить приложение в отладчике, и вы увидите, что происходит. Мое первое предположение (глядя на хрустальный шар) состоит в том, что вы создаете объект Config с автоматической продолжительностью хранения в области (Config config = get_config(); - этот создает новый объект в текущей области, который копия объекта conf) и затем получение указателя на него (Config *g_config = &config; - указатель на объект config в текущей области, а не на глобальный conf), который вы затем передаете и позже используете вне область действия, когда объект уже был уничтожен.

Другой вариант заключается в том, что вы столкнулись с фиаско порядка инициализации , если эти две строки не находятся внутри контекста, в этом случае вы можете попытаться скопировать еще неинициализированный объект conf в config.

Само std::bad_alloc - это исключение, которое выдается, когда new не удается выделить память, и это может произойти, если в системе не хватает ресурсов (возможно, здесь нет проблемы) или если запрос неверен.

1 голос
/ 03 сентября 2011

Если у вас есть такие объявления в шапке:

struct Config
{
 ....
}conf;
get_conf();

тогда это, вероятно, будет эквивалентно:

struct Config { ... } ;
Config conf;
int get_conf();

"вероятно", потому что в C пропущенный тип возврата подразумевает, что тип возвращаемого значения - int. Это не так в C ++, но компилятор MSVC на самом деле не настолько совместим со стандартами, поэтому, возможно, он пропустил это, esp. если у вас отключено предупреждение.

Если это так, это может привести к объявлению

int get_conf();

, который будет связан с определением:

Config get_conf() { ... }

в исходном файле. Если это ссылки, такой вызов приведет к краху вашей программы.

0 голосов
/ 03 сентября 2011

У меня нет компилятора для подтверждения, но это как минимум часть проблемы. conf определенный в заголовке не будет работать. Если вы используете заголовок в двух файлах cpp, вы получите дубликаты символов.

Я бы предположил, что Кос прав в том, почему вы получаете сообщение, которое вы делаете с ошибкой сегмента. У вас могут быть некоторые предупреждения (не отключайте их), которые подтвердили бы это.

Мое другое предположение может заключаться в том, что он пытается использовать объявленную, но неинициализированную переменную.

Это то, что я ожидал, предполагая, что вы не хотите делать кучу копий вашего 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;
0 голосов
/ 03 сентября 2011

Одной из проблем может быть конструкция структуры, она может выйти из строя при компиляции, т.е. перед созданием / инициализацией структуры вы присваиваете некоторый адрес указателю.

Итак,убедитесь, что все создание / инициализация данных GLOBAL происходит в одном модуле компиляции cpp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...