Я пытаюсь определить переменную из внешней библиотеки в C ++, Visual Studio 2010. Она работает только тогда, когда я помещаю ее вне основной функции.
Этот код вылетает:
#include "StdAfx.h"#include <ogdf\basic\Graph.h>
#include <ogdf\basic\graph_generators.h>
int main()
{
ogdf::Graph g;
ogdf::randomSimpleGraph(g, 10, 20);
return 0;
}
Это дает мне необъяснимое исключение: нарушение доступа.
Однако, если он находится за пределами основной функции, он работает без проблем:
#include "StdAfx.h"#include <ogdf\basic\Graph.h>
#include <ogdf\basic\graph_generators.h>
ogdf::Graph g;
int main()
{
ogdf::randomSimpleGraph(g, 10, 20);
return 0;
}
Есть ли у вас как это исправить? Я предполагаю, что это вызвано какой-то проблемой связывания.
РЕДАКТИРОВАТЬ: похоже, проблема не в инициализации переменной. Выдает исключение при выходе из приложения.
int main()
{
ogdf::Graph g; // No problem
ogdf::randomSimpleGraph(g, 10, 20); // No problem
int i; // No problem
std::cin>>i; // No problem
return 0; // Throws an exception after read i;
}
Стек вызовов:
Выход:
Исключение первого шанса в 0x0126788f в файле graphs.exe: 0xC0000005: место записи нарушения прав доступа 0x00000000.
Необработанное исключение в 0x0126788f в graphs.exe: 0xC0000005: Место записи нарушения прав доступа 0x00000000.
Работает на моей машине ™.
Подобные эзотерические ошибки часто являются результатом двоичной несовместимости. По сути, из-за разных опций компилятора / препроцессора эффективные заголовки, которые ваш код и библиотека «видят», различны.
Например, если у вас есть библиотека со следующим кодом заголовка:
class Foo
{
#ifdef FOO_DEBUG
int debug_variable;
#endif
int variable;
};
Функция библиотеки:
void bar(Foo& foo)
{
std::cout << foo.variable;
}
И код клиента:
Foo foo;
foo.variable = 666;
bar(foo);
Если FOO_DEBUG
не синхронизируется между клиентом и библиотекой, это может привести к сбою и сбою — variable
будет иметь другое ожидаемое смещение.
В вашем случае, я подозреваю, что одно из следующего может быть правдой:
OGDF_DEBUG
(как рекомендовано Вот)Других решений пока нет …