auto_ptr.release()中的分段错误

时间:2012-05-05 08:31:35

标签: c++ linux segmentation-fault auto-ptr

在调用auto_ptr release member时,我在代码点遇到分段错误:

try
{
    newMod->init(params);
}
catch (const std::exception& e)
{
#ifndef CONFIG_STATIC
    dlclose(handle);
#endif
    throw std::runtime_error(utils::buildString(
            "%s: Error initializing module %s: %s",
            DBG_FUNC_NAME, newMod->name().c_str(), e.what()));
}

_modules.insert(std::make_pair(newMod->name(), newMod.release()));

_modules在哪里

std::map<std::string, IModule*> _modules;

和newMod是

std::auto_ptr<IModule> newMod(0);

稍后使用适当的指针值重置。我知道IModule的指针是有效的,因为我在发布之前调用了init成员。

此:

_modules.insert(std::make_pair(newMod->name(), newMod.get()));
newMod.release();

效果非常好,这就是gdb所说的:

#0  _M_rep (this=0xbfe8e908, __str=...) at /usr/src/debug/gcc-4.5.1-20101208/obj-i586-suse-linux/i586-suse-linux/libstdc++-v3/include/bits/basic_string.h:287
#1  std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string (this=0xbfe8e908, __str=...)
at /usr/src/debug/gcc-4.5.1-20101208/obj-i586-suse-linux/i586-suse-linux/libstdc++-v3/include/bits/basic_string.tcc:173
#2  0x0805d76f in sm::core::mod::ModuleManager::loadModule (this=0x8074768, name=..., params=...) at src/core/ModuleManager.cpp:150
#3  0x08056edb in sm::core::Main::start (this=0xbfe8e9e0) at src/core/Main.cpp:82
#4  0x08055131 in main (argc=4, argv=0xbfe8ebf4) at src/core/smmain.cpp:15

它的段落是:

{ return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }

对这个问题可能出错的任何想法?

1 个答案:

答案 0 :(得分:4)

_modules.insert(std::make_pair(newMod->name(), newMod.release()));

标准未定义函数参数的评估顺序。实施可以在newMod.release()之前评估newMod->name(),这会使第二次调用无效。


附注:{+ 1}}在C ++ 11中被弃用(n3290草案中的附件D.10):

  

不推荐使用类模板auto_ptr。 [注意:类模板auto_ptr(20.7.1)提供了更好的解决方案。 - 结束说明]

如果你有权访问它,以及时间/资源,请考虑切换到较新的智能指针类。