std :: vector容量太大

时间:2019-04-06 12:46:11

标签: c++ visual-c++ stdvector

所以我遇到的vc ++中的std :: vector存在这个问题。在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);

此后,indexs_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 :(得分:0)

问题是头文件中的预处理器状况。如果定义了makro,我将声明_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;
...

此简单的更改使其起作用。我在构造函数中仍然有预处理条件。