Форум программистов, компьютерный форум, киберфорум
SFML
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
3 / 2 / 1
Регистрация: 11.12.2020
Сообщений: 71

Ошибка при работе с указателями

02.10.2021, 01:13. Показов 1295. Ответов 2
Метки c++, sfml (Все метки)

Студворк — интернет-сервис помощи студентам
В классе сцены я храню данные об объектах в векторе :
C++
1
    std::vector<TestObject> m_testObj;
Создав очередного представителя TestObject в конструкторе сцены, я добавляю его в вектор с помощью метода :
C++
1
2
3
4
void Scene1::addTest(TestObject& obj)
{
    m_testObj.push_back(obj);
}
После чего в вечном цикле я вызываю апдейт объектов:
C++
1
2
3
4
for (int i = 0; i < m_testObj.size(); i++)
        {
            m_testObj[i]->update(window);
        }
В этом конкретном случае апдейт представляет собой просто отрисовку sfml:
C++
1
2
3
4
void TestObject::update(sf::RenderWindow& window)
{
    window.draw(m_sprite);
}
И все бы было хорошо, но вместо текстур(раскрашенных прямоугольников) отображаются лишь белые прямоугольники.
Как выяснилось эта проблема решается с помощью указателей.
вектор переделать в это:
C++
1
    std::vector<TestObject*> m_testObj;
запихивание в вектор тоже с помощью указателя
C++
1
    void addTest(TestObject* obj);
А теперь собственно к вопросу. Во-первых, почему так происходит?
Во-вторых, можно ли тут как-то работать без указателей?
Потому что похоже, что объекты придется создавать, динамически выделяя память
C++
1
2
3
        TestObject* TObj = new TestObject;
        TObj->createSprite("Images\\Use\\Terrain\\box.png");
        this->addTest(TObj);
как-то так. Но на счет утечек меня очень сильно запугали, потому и страшно работать пока что с этим загадочным new))
В- третьих(если все-таки нельзя работать без new), правильно ли я понимаю , что созданные объекты в конце сцены нужно будет удалять таким образом :
C++
1
delete TObj;
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.10.2021, 01:13
Ответы с готовыми решениями:

Ошибка при работе с указателями
Дан вот такой кусок кода: #include &lt;stdio.h&gt; int main() { char mas; scanf(&quot;%s&quot;,mas); char **pos; ...

MSVS ошибка setlocale при работе с указателями на массивы
Ниже код, пытаюсь нарисовать умножение матриц. До самого умножения еще не дошел, пока только на заполнении матриц и вывод их на экран....

Как избавиться от * и . при работе с указателями?
Сразу приведу пример: #include &lt;stdio.h&gt; struct struct5 { int* value; }; struct struct4 { struct5* s5; };

2
Модератор
Эксперт Java
 Аватар для alecss131
2843 / 1352 / 403
Регистрация: 11.08.2017
Сообщений: 4,317
Записей в блоге: 2
02.10.2021, 10:25
Лучший ответ Сообщение было отмечено slverwolf как решение

Решение

На сколько я знаю (но могу ошибаться) вектор при работе с классами хранит у себя не копии объектов, а их адреса. И получается что вы создаете в методе объект, передаете его по ссылке в другой метод который сохраняет его в вектор и при завершении метода где объект был создан он удаляется, следовательно в векторе остается мусор.
С использованием указателей нету ничего сложного, главное всегда помнить про баланс добра и зла что раз используешь new то к нему в пару всегда должен идти delete. Либо использовать умные указатели, но я предпочитаю сам всем управлять. В вашем случае можно очищать память например в деструкторе класса который хранит в себе вектор.
Например вот так:
C++
1
2
3
for (auto o : m_testObj) {
    delete o;
}
1
Just Do It!
 Аватар для XLAT
4198 / 2653 / 654
Регистрация: 23.09.2014
Сообщений: 8,947
Записей в блоге: 3
03.10.2021, 18:18
Цитата Сообщение от slverwolf Посмотреть сообщение
TestObject* TObj = new TestObject;
        TObj->createSprite("Images\\Use\\Terrain\\box .png");
        this->addTest(TObj);
я бы назвал это архитектурным багом:
логично же создавать объект в МЕСТЕ ЕГО ХРАНЕНИЯ и получать его от туда по надобности.

Цитата Сообщение от slverwolf Посмотреть сообщение
Как выяснилось эта проблема решается с помощью указателей.
указатели для этого не нужны,
я вам уже показывал, как это решается:
Передача спрайта по ссылке

указатели, в принципе, могут понадобиться только на этапе оптимизации,
и то в конкретных ваших алгоритмах(здесь пока отсутствующих), которые это могут принять.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.10.2021, 18:18
Помогаю со студенческими работами здесь

Что не так при работе с указателями?
Здравствуйте! Начинаю изучать работу с указателями. #include &lt;iostream&gt; using namespace std; int fun(int a, int b, long...

Программа выпадает в ошибку при работе с указателями
Всем привет. Пишу на C для контроллера. Вырезка из программы ниже. Суть проблемы. При попытке сравнить ccrc c Crc16 вываливается в...

External SIGSEGV при работе с указателями в классе
Lazarus. Имеется реализация списка. unit classlist; {$mode objfpc}{$H+} interface uses Classes, SysUtils; type...

Помогите найти ошибку в коде при работе с указателями
Блин, я когда нибудь пойму эти указатели!!???? Подскажите где ошибся? #include&lt;iostream&gt; using namespace std; int...

Исправить ошибку компиляции C2371 при работе с указателями
Привет :) Проходу тему &quot;Указатели&quot;, написал программу. Компилятор ругается, не знаю почему. Сделал всё так как написано в примере....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru