Проблемы с динамическим массивом текстур/C++ SFML

у меня проблема с загрузкой текстур в С++ SFML в динамический массив. Программа работает через несколько раз и, по-большему счёту, выдаёт одну ошибку: "C++ Game TeraCraft (CGTR).exe вызвал срабатывание точки останова". Вот код функции, загружающей всё:

void load_texture() {
    texture_union_block = new texture_folder[block_max_id];
    texture_union_wall = new texture_folder[wall_max_id];

    for (int i = 0; i <= block_max_id; i++) {
        texture_union_block[i].def = 'b';
        texture_union_block[i].id = i;
        texture_union_block[i].texture.loadFromFile("storage/sprites/block and wall/" + std::to_string(texture_union_block[i].id) + texture_union_block[i].def + ".png");
        sprite_union_block.push_back(sf::Sprite(texture_union_block[i].texture));
    }
    for (int i = 0; i <= wall_max_id; i++) {
        texture_union_wall[i].def = 'w';
        texture_union_wall[i].id = i;
        texture_union_wall[i].texture.loadFromFile("storage/sprites/block and wall/" + std::to_string(texture_union_wall[i].id) + texture_union_wall[i].def + ".png");
        sprite_union_wall.push_back(sf::Sprite(texture_union_wall[i].texture));
    }
}

Это код texture_folder

struct texture_folder {
    sf::Texture texture;
    short id; char def;

    texture_folder() { id = 0; def = ' '; }

    texture_folder(short _id, char _def) : id(_id), def(_def) {}
};

block_max_id и wall_max_id рассчитываются по максимальным значениям матрицы. Проблем с кол-вом текстур нет.

Если кто-то знает, есть ли контейнеры по-лучше, чем простой динамический массив, но без реаллокации данных, которую делает std::vector?


Ответы (2 шт):

Автор решения: Παν μέτρον άριστον

Реаллокации не будет, если ты не попросишь об этом std::vector. Чтобы узанть размер выделенной аллокатором памяти - метод capacity, размер занятой памяти - size. К тому же ты можешь зарезервировать память сразу после создания объекта через метод reserve.

В случае текстур наверно логичнее будет использовать вектор из указателей на них. Ну и... включи дебаг и отлаживай.

→ Ссылка
Автор решения: Eil_ RoviSoft

Короче, я решил свою проблему через векторы, как и мне рекомендовали. Я просто заменил динамические массивы на векторы и заранее прописал reserve. Теперь код работает всегда, а не через раз. Вот код:

void load_texture() {
            texture_union_block.resize(block_max_id + 1);
            texture_union_wall.resize(wall_max_id + 1);

            for (int i = 0; i <= block_max_id; i++) {
                texture_union_block.at(i).def = 'b';
                texture_union_block.at(i).id = i;
                texture_union_block.at(i).texture.loadFromFile("storage/sprites/block and wall/" + std::to_string(texture_union_block.at(i).id) + texture_union_block.at(i).def + ".png");
                sprite_union_block.push_back(sf::Sprite(texture_union_block.at(i).texture));
            }
            for (int i = 0; i <= wall_max_id; i++) {
                texture_union_wall.at(i).def = 'w';
                texture_union_wall.at(i).id = i;
                texture_union_wall.at(i).texture.loadFromFile("storage/sprites/block and wall/" + std::to_string(texture_union_wall.at(i).id) + texture_union_wall.at(i).def + ".png");
                sprite_union_wall.push_back(sf::Sprite(texture_union_wall.at(i).texture));
            }
        }
→ Ссылка