如何修复内存访问错误

时间:2008-12-22 14:01:48

标签: c++ memory solaris

我正在开发一个迁移项目,这里我们正在将大量的C ++库从Mainframe迁移到Solaris。我们已成功完成迁移,但在运行应用程序时,有些地方会因“信号SEGV(故障地址没有映射)”而崩溃。

由于应用程序也支持Windows,我们在windows上检查了purify。应用程序中没有内存泄漏,它在Windows上运行正常。

任何人都可以建议,可能造成此类错误的其他原因是什么。用于跟踪此类错误的任何工具?

4 个答案:

答案 0 :(得分:1)

这不一定是内存泄漏。可能是在它被释放后,引用了一块内存。

我的朋友曾经带着一段在Windows上正常运行但在Linux上运行segv的代码来找我。事实证明,有时你在Windows上释放它(可能是很短的一段时间)之后内存仍然有效,但是在Linux上立即触发了segv。

答案 1 :(得分:1)

下面这行看起来不对我

m_BindMap[sLabel] = b;   // crashes at this line at when map size

我假设您正在尝试在字符串末尾添加一个数字。试试这个

stringstream ss;
ss << ":BIND" << ns;
string sLabel = ss.str();

答案 2 :(得分:0)

你在使用g ++吗?如果是这样,请使用“-g”标志重新编译。在gdb中运行该程序。当它崩溃时键入“bt”(用于回溯),那应该告诉你问题在哪里。

答案 3 :(得分:0)

我在solaris和dbx调试器上使用CC编译器。我知道它崩溃的调用堆栈。但这是一次惨淡的崩溃。

map<string,CDBBindParam,less<string> >m_BindMap;



CNumString ns(CNumStringTraits(0,2,'0'));
ns = m_BindMap.size();
string sLabel = ":BIND"+ns;
CDBBindParam b(sLabel,val);
**m_BindMap[sLabel] = b;**   // crashes at this line at when map size is more than 2
return sLabel;