处于释放模式时,C ++向量未初始化为空

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处于释放模式时,C ++向量未初始化为空相关的知识,希望对你有一定的参考价值。

这是我在堆栈溢出时发布的更模糊的错误之一,所以如果看起来有点缺乏信息,我会提前感到抱歉。我有一个相当大的项目,它使用静态向量来包含应用程序生命周期的信息。在调试模式下,一切都顺利完成,但在发布模式下,矢量似乎未初始化。当我逐步完成解决方案时,我可以看到在发布模式下,向量具有随机大小,并且充满了每次运行应用程序时都会发生变化的废话,这使我相信它们是未初始化的,只是从堆中读取随机信息。对于大规模的项目来说,显示所有代码并在解析整个事务时请求帮助是很困难和不公平的,所以我已经提取了相关信息。这样做的问题是在提取的代码中不会发生相同的错误,就好像构建经历了不同的优化并且因此不会产生相同的错误。

一个过长的故事,我想知道他们是否可以强制初始化大小为0的向量,这样这样的初始化就不会被优化掉。

如果有帮助,这里提取代码:

#include <vector>
#include <iostream>
using std::getchar;
using std::vector;
class Entity {
public:
    short id;
    Entity(short i) : id(i) {

    }
};

class EntityManager {
    static Entity& CreateEntity(vector<Entity> &entities, unsigned short i);
public:
    static vector<Entity> dynamicEntities;
    static vector<Entity> staticEntities;

    static Entity& CreateDynamicEntity();
    static Entity& CreateStaticEntity();
};

vector<Entity> EntityManager::dynamicEntities;
vector<Entity> EntityManager::staticEntities;

Entity& EntityManager::CreateEntity(std::vector<Entity> &entities, unsigned short i) {
    entities.push_back(Entity((entities.size())));
    Entity& entity = entities.back();
    return entity;
}

Entity& EntityManager::CreateDynamicEntity() {
    return CreateEntity(dynamicEntities, 1);
}

Entity& EntityManager::CreateStaticEntity() {
    return CreateEntity(staticEntities, 0);
}

int main() {
    Entity& e = EntityManager::CreateDynamicEntity();
    std::cout << e.id;
    getchar();
    return 0;
}

在此先感谢您的帮助。

答案

您的问题似乎是由于全局变量的初始化顺序不确定而导致的。

使它们具有确定性的一种方法是用函数包装数据。

而不是使用

vector<Entity> EntityManager::dynamicEntities;

使用

vector<Entity>& EntityManager::getDynamicEntities()
{
   // This guarantees that entities is initialized properly 
   // before it is accessed by calling code.
   static vector<Entity> entities;
   return entities;
}

当然,这意味着将EntityManager改为:

class EntityManager {
    static Entity& CreateEntity(vector<Entity> &entities, unsigned short i);
  public:
    static vector<Entity>& getDynamicEntities();
    static vector<Entity>& getStaticEntities();

    static Entity& CreateDynamicEntity();
    static Entity& CreateStaticEntity();
};

以上是关于处于释放模式时,C ++向量未初始化为空的主要内容,如果未能解决你的问题,请参考以下文章

CWE-329: 密码分组链接模式未使用随机初始化矢量

C++ Vector 实现分配新对象

C++ - 未分配被释放的指针

C++ 未初始化的结构成员 - 字段不存在

C ++函数中矢量大小未增加的问题

用C语言编写一个计算两个向量叉积的程序