c ++静态变量在发布模式下初始化错误

时间:2012-08-12 06:38:45

标签: c++ stl static release

项目环境:
windows 7 x64专业版 visual studio 2008 c ++ sp1 pro
win32 api
directx 9.0c 2010年6月
提升

问题:
我的项目在DEBUG模式下运行成功。但只发生释放模式错误。

template <typename T>
class SceneVector : public std::vector<T>
{
public:
    SceneVector()
    {
        for(int i = 0 ; i < MAX_OBJNODE_NUMBER ; ++i) push_back(NULL);
    }
}; 



//i think the class's contents are not important
class ITaggingDebugInfo
{
protected:
    int idvl;
public:
    ITaggingDebugInfo();
    ~ITaggingDebugInfo();
    int iTaggindDebugInfoID;
    virtual std::vector<AbstractTag*> OnMakeTagList(int VlogicPackageID);
    static void Select(int vlid, int id);
    static stdext::hash_map<int,SceneVector<ITaggingDebugInfo*>> TaggingDebugInfoManager; //problem
    static std::vector<AbstractTag*> taglist[MAX_SCENE_NUMBER];             
};

//on other's cpp file
stdext::hash_map<int,SceneVector<ITaggingDebugInfo*>> ITaggingDebugInfo::TaggingDebugInfoManager;

静态hash_map的构造函数发生了释放模式问题 这是我的STL调试步骤。 第1步

hash_map()
: _Mybase(key_compare(), allocator_type())
    {   // construct empty map from defaults
    }

第2步

    explicit _Hash(const key_compare& _Parg,
    const allocator_type& _Al)
    : _Traits(_Parg), _List(_Al),
        _Vec(_Al),
        _Max_bucket_size(_Bucket_size)
    {   // construct empty hash table
    _Init();
    }

第3步

void _Init(size_type _Buckets = min_buckets)
    {   // initialize hash table with _Buckets buckets, leave list alone
    _Vec.assign(_Buckets + 1, end());
    _Mask = _Buckets - 1;
    _Maxidx = _Buckets;
    }

当步骤3时,指针为NULL(0x00000000)(由调试器的观察者。但由于释放模式而不是自信)和访问冲突异常。

但在DEBUG模式下,错误不会发生 我真的不知道为什么会出现这个问题。 有人帮帮我!

1 个答案:

答案 0 :(得分:3)

您不应该从像vector这样的STL容器派生,因为它们不提供虚拟析构函数。我怀疑你正在经历的行为可能是因为这个原因。阅读有关在此处执行此操作的所有优缺点:Thou shalt not inherit from std::vector