Проблемы с динамическим массивом текстур/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.
В случае текстур наверно логичнее будет использовать вектор из указателей на них. Ну и... включи дебаг и отлаживай.
Короче, я решил свою проблему через векторы, как и мне рекомендовали. Я просто заменил динамические массивы на векторы и заранее прописал 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));
}
}