Форум программистов, компьютерный форум CyberForum.ru

Пустые указатели (ошибка доступа) - C++

Восстановить пароль Регистрация
 
Progers
New to C++
 Аватар для Progers
83 / 44 / 5
Регистрация: 14.01.2013
Сообщений: 258
08.08.2014, 21:44     Пустые указатели (ошибка доступа) #1
Здравствуйте, пишу простенький фрамеворк для загрузки текстур для того чтобы добавить эти текстуры в игру.
Существует Класс Load -> Наследник Texture
-> Наследник Font
Класс GameOBJ - для игровых обьектов
Класс Game - для самой игры, инициализация всяких систем и так далее.
Я использую библиотеку SDL2 в Visual Studio 2013
Так вот, в Классе Texture есть метод
C++
1
static Texture* Instance()
который возвращает
C++
1
new Texture
И обьявление
C++
1
Static Texture* ThisInstance
и в Texture.cpp он обьявлен как
C++
1
Texture* Texture::ThisInstance = nullptr
Реализация такова:
C++
1
2
3
4
5
6
7
8
9
Texture* Texture::Instance()
{
    if (Texture_Instance = nullptr)
    {
        Texture_Instance = new Texture;
        return Texture_Instance;
    }
    return Texture_Instance;
}
Тоже самое в GameOBJ только там вместо Texture стоит GameOBJ

Так вот, из класса Game я вызываю:
C++
1
2
3
4
void Game::PushGameObj()
{
    GameOBJ::Instance()->Push_Objects("test.png","test");
}
Который в свою очередь идёт в:
C++
1
2
3
4
5
void GameOBJ::Push_Objects(std::string Texture_P,std::string ID)
{
    Texture::Instance()->LoadSurface(Texture_P);
    Texture::Instance()->PushTexture(ID);
}
И который идёт в:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool Texture::LoadSurface(std::string Path)
{
    Texture_Surface = IMG_Load(Path.c_str());
    if (Texture_Surface == nullptr)
    {
        std::cerr << "Could not create surface because of Img_GetError =  " << IMG_GetError << std::endl;
        Success = false;
    }
    else
    {
        std::cout << "Success Creating Surface " << std::endl;
        Success = true;
    }
    return Success;
}
И в
C++
1
2
3
4
5
6
void Texture::PushTexture(std::string ID)
{
    Load::PushTexture(ID, Texture_Surface);
    SDL_FreeSurface(Texture_Surface);
    Texture_Surface = nullptr;
}
Проблема возможно или в
C++
1
SDL_Surface* Texture_Surface = nullptr;
Это находится в Texture.h в Private
Или в чём то другом.
Так вот вопрос, когда он заходит в метод LoadSurface и доходит до значения
C++
1
 Texture_Surface = IMG_Load(Path.c_str());
Появляется ошибка доступа, и This показывает NULL. В чём может заключатся проблема?
Миниатюры
Пустые указатели (ошибка доступа)   Пустые указатели (ошибка доступа)  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Progers
New to C++
 Аватар для Progers
83 / 44 / 5
Регистрация: 14.01.2013
Сообщений: 258
08.08.2014, 21:56  [ТС]     Пустые указатели (ошибка доступа) #2
Проблему решил, когда повнимательнее поглядел на код, там где
C++
1
2
3
4
5
6
7
8
9
Texture* Texture::Instance()
{
    if (Texture_Instance = nullptr)
    {
        Texture_Instance = new Texture;
        return Texture_Instance;
    }
    return Texture_Instance;
}
Вместо двух знака равенства я написал 1 и это вызвало ошибку пустого указателя!
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
09.08.2014, 01:16     Пустые указатели (ошибка доступа) #3
Progers, добавлю просто к сведению. Лучше не использовать new в синглтонах - используй static (a la mayers singleton). Особенно в свете гарантий С++11 насчет static.
Progers
New to C++
 Аватар для Progers
83 / 44 / 5
Регистрация: 14.01.2013
Сообщений: 258
09.08.2014, 13:35  [ТС]     Пустые указатели (ошибка доступа) #4
DrOffset, Хорошо, спасибо!
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
09.08.2014, 15:16     Пустые указатели (ошибка доступа) #5
Цитата Сообщение от Progers Посмотреть сообщение
Texture_Instance = nullptr
Это просто опечатка?
Progers
New to C++
 Аватар для Progers
83 / 44 / 5
Регистрация: 14.01.2013
Сообщений: 258
09.08.2014, 16:16  [ТС]     Пустые указатели (ошибка доступа) #6
Цитата Сообщение от CyberSolver Посмотреть сообщение
Это просто опечатка?
Почему опечатка? Всё нормально там.

Добавлено через 59 секунд
Цитата Сообщение от CyberSolver Посмотреть сообщение
Это просто опечатка?
А извиняюсь, да эта была ошибка, но я её ещё вчера заметил
Yandex
Объявления
09.08.2014, 16:16     Пустые указатели (ошибка доступа)
Ответ Создать тему
Опции темы

Текущее время: 10:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru