std :: vector емкость становится слишком большой - PullRequest
0 голосов
/ 06 апреля 2019

Так что я столкнулся с проблемой std :: vector в vc ++.В g ++ это работает нормально, однако в vc ++ после вставки 6 элементов и вызова конструктора емкость имеет значение более 1000000000, и shrink_to_fit () вылетает из моей программы.Я не знаю, что вызывает это, но я собираюсь опубликовать код для причины:

Этот код инициализирует вектор:

std::vector<unsigned> indices_rect {
    0, 1, 2,
    2, 3, 0
};

Затем вызывается эта статическая функция,он устанавливает строку для пути по умолчанию:

engine::Texture::set_default_texture("../res/textures/engine/default_texture.jpg", engine::ImageType::JPG);

После этого емкость indices_rect по-прежнему равна 6, как и размер.Но сразу же, как я прыгаю в конструктор для "Shaderfile", перед выполнением первой строки емкость устанавливается в указанное большое число.Это происходит в следующей строке.

engine::Shaderfile textured("../res/shaders/engine/textured.glsl", indices_rect);

Я передал вектор, чтобы посмотреть, что происходит внутри конструктора.Начало выглядит так:

Shaderfile::Shaderfile(std::string path, const std::vector<unsigned>& v)
{
// Capacity gets set here
#ifdef _ENGINE_DEBUG
    _path = path;
#endif
    std::ifstream file;
    std::stringstream fs;
    file.exceptions(std::ifstream::badbit | std::ifstream::failbit);
...

Но даже перед строкой "_path = path" емкость для v превышает 1000000000. Если у кого-то есть идея, в чем может быть проблема,пожалуйста, помогите.

1 Ответ

0 голосов
/ 06 апреля 2019

Проблема была в условии препроцессора в заголовочном файле.Если бы был определен макрос, я бы объявил переменную _path и инициализировал ее в конструкторе с тем же условием.Как только я удалил условие в заголовочном файле, оно работает.

[Shaderfile.h] До:

...
private:
#ifdef _ENGINE_DEBUG
    std::string _path;
#endif
    std::array<std::string, 4> _sources;
...

[Shaderfile.h] После:

...
private:
    std::string _path;
    std::array<std::string, 4> _sources;
...

Это простое изменение заставило его работать.У меня все еще есть условие препроцессора в конструкторе.

...