【问题标题】:c++ static variable initialize error on release modec ++静态变量在发布模式下初始化错误
【发布时间】:2012-08-08 20:25:40
【问题描述】:

项目环境:
Windows 7 x64 专业版
视觉工作室 2008 c++ sp1 pro
win32 接口
directx 9.0c 2010 年 6 月
提升

问题:
我的项目在调试模式下运行成功。但只发生发布模式错误。

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 调试步骤。 第一步

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

第二步

    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();
    }

第三步

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 步时,this 指针为 NULL(0x00000000)(由调试器的观察者。但由于释放模式不自信)和访问冲突异常。

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

【问题讨论】:

  • 调高警告级别。默认值太低。在旧版本的 DevStudio 中,我总是把这个设置得太大。在较新的版本上,显然他们有一个新的更高的最大值,这只是很高的(但我还没有看到)。还要选中“将警告视为错误”框。现在尝试重建。
  • 为了帮助解决此类问题,您需要将代码缩减为最小的可编译示例,以在发布之前展示问题。通常这个过程会引导你找到问题,否则你会得到 1,000,000 对可以查看真实代码的眼睛。
  • P.S.以下划线开头的标识符通常保留用于实现。因此_Vec 使您的代码不合格,因此在技术上无效。见stackoverflow.com/a/228797/14065
  • namespace stdext中使用了保留的标识符,听起来可能实际上来自实现。

标签: c++ stl static release


【解决方案1】:

您不应该从像 vector 这样的 STL 容器派生,因为它们不提供虚拟析构函数。我怀疑您遇到的行为可能是因为这个。在此处阅读有关这样做的所有利弊:Thou shalt not inherit from std::vector

【讨论】:

  • 谢谢,我无法理解文档的所有含义,但我知道一件事:不要从 STL 容器继承
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 2021-07-28
  • 1970-01-01
  • 2012-10-26
相关资源
最近更新 更多