Проблема в вашем main()
int main()
{
XInitThreads();
Application* app;
app->run();
}
Вы должны использовать new
здесь и выделить ваше Application
:
int main()
{
XInitThreads();
Application* app = new Application(...);
app->run();
}
Однако, Дон't сделать это в Network
. Это создаст утечку памяти. Сделайте это вместо этого:
Network::Network(Application *app)
{
application = app;
window = app->window;
}
Редактировать:
Может кто-нибудь объяснить, почему это работает, а использование указателя - нет?
Итак, указатели не выделяют память самостоятельно. Они просто указатели. Они держат адреса. Они не выделяют память самостоятельно, чтобы разрешить такие вещи:
int a =0;
int *b = &a; // holds address of a
Если указатели выделяют данные здесь, это может вызвать утечку памяти или другие вещи. Таким образом, если вы хотите хранить новый объект независимо от других переменных, вам нужно использовать new
или какой-нибудь умный указатель:
int* c = new int; // c holds an int independent of a or b
Таким образом, если вы просто делаете что-то вроде этого:
int* d;
d
не имеет выделенной памяти на своей позиции. Это заполнитель, который может содержать любой адрес. Он может содержать существующий адрес или новый адрес. Но ему нужно сохранить некоторый действительный адрес, прежде чем вы сможете его использовать.
Если вы хотите создать экземпляр Application
, вам нужно либо выделить его с помощью new
, либо, как отмечали другие,даже не используйте указатель вообще, что на самом деле является рекомендуемым курсом действий:
int main()
{
XInitThreads();
Application app;
app.run();
}