我尝试使用c ++创建一个win32 dll。它有一个全局声明的地图。但是当我尝试使用dll访问地图时,它会给出一个运行时错误: WindowsError:exception:access violation reading 0x00000008 。怎么解决?
声明:static map<int,urllib> url_container;
urllib是一个类。
错误发生:url_container[ucid] = urllib();
错误发生在上述点。
答案 0 :(得分:1)
我假设urllib是一个类型或类而不是函数?
您的代码看起来没有任何问题。在调试器中,当异常发生时,您在调用堆栈上看到了什么?查看它在访问冲突中的确切位置会很有帮助。
答案 1 :(得分:0)
如果地图中不存在,您可能想尝试插入它,虽然您拥有的应该没问题
url_container.insert ( pair<int,urllib>(ucid,urllib()) );
答案 2 :(得分:0)
我想解决访问冲突的唯一合理方法是使用调试器。
答案 3 :(得分:0)
这段代码
url_container[ucid] = urllib()
在另一个全局对象的静态初始化程序中调用?如果是这样,则无法保证在另一个全局对象之前已经使用url_container
。
使用访问者函数来控制创建对象的时间,或使用像boost singleton这样的单例库
访问者示例
map<int,urllib> & get_url_container()
{
static map<int,urllib> url_container;
return url_container
}
顺便说一下,我建议你尽量避免使用全局对象。因为你可以用你的余生来调试这样的问题。最终,一个全局对象的构造将取决于另一个等,并且未定义构造的顺序,因此它可能在一个平台/编译器上工作而在另一个平台/编译器上失败。