C++ c++;释放模式下静态变量初始化错误
项目环境:C++ c++;释放模式下静态变量初始化错误,c++,stl,static,release,C++,Stl,Static,Release,项目环境: windows 7 x64 pro Visual Studio 2008 C++ SP1 PRBR win32 api directx 9.0c 2010年6月 促进 问题: 我的项目在调试模式下成功运行。但只会发生释放模式错误 template <typename T> class SceneVector : public std::vector<T> { public: SceneVector() { for(int i =
windows 7 x64 pro
Visual Studio 2008 C++ SP1 PRBR win32 api
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;
步骤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)(由调试器的观察者执行。但由于发布模式的原因,它不可靠)并且访问冲突异常
但在调试模式下,不会发生错误。我真的不知道为什么会发生这个问题。
谁来帮帮我 您不应该从像
vector
这样的STL容器派生,因为它们不提供虚拟析构函数。我怀疑你的行为可能就是因为这个。在这里阅读所有关于这样做的利弊:将警告级别调高。默认值太低。在旧版本的DevStudio中,我总是将其设置为最大值。在新版本中,它们有一个新的更高的最大值,这正是达到最高值的方式(但我没有看到)。同时选中“将警告视为错误”的框。现在尝试重新构建。为了帮助解决此类问题,您需要将代码减少到最小的可编译示例,在发布之前显示问题。通常,这个过程会让你找到问题,如果没有,那么你会有一百万双眼睛可以看到真正的代码。以下划线开头的标识符通常为实现保留。因此,\u Vec
使您的代码不符合要求,因此在技术上无效。请参阅名称空间stdext
中使用的保留标识符,听起来它实际上可能来自实现。谢谢,我无法理解文档的所有含义,但我知道一件事:不要从STL容器继承
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;
}