【发布时间】:2012-01-05 00:14:03
【问题描述】:
我有一个名为 OrdinalObjectList 的模板类,它只是一个带有 int 键和对象指针的映射。它的目的是提供可以通过序号键访问的对象指针的集合。这是课程:
template <typename O>
class OrdinalObjectList {
public:
std::map<int, O*> List;
OrdinalObjectList() {};
virtual ~OrdinalObjectList()
{
// Need to delete the objects in the map
typename std::map<int, O*>::iterator i;
for (i = List.begin(); i != List.end(); i++)
{
O* d = i->second;
delete d;
}
};
在破坏 OrdinalObjectList 时,析构函数循环遍历映射并删除对象。到目前为止,这一直运行良好,但是在删除集合中两个对象中的第二个时,它当前收到 EXC_BAD_ACCESS 错误。
第一遍 d 是 'FSCE::Customer' * 0x10088e600,删除没有问题。在第二遍中,d 是 'FSCE::Customer' * 0x100897e00,当 delete'd 会导致 EXC_BAD_ACCESS。我可以在调试器中访问第二个“d”的成员。即d->lifeid int 2,表示FSCE::Customer对象是一个有效的对象,而'd'是一个有效的指针。
接下来我应该采取哪些步骤来追查 EXC_BAD_ACCESS 的原因?
【问题讨论】:
-
使用用于检测空闲后访问的工具运行代码,例如
valgrind。最有可能的是,之前的 malloc/free/new/delete 操作正在破坏堆,导致此删除失败。 -
我现在正在这样做。用于 OSX 的 Valgrind 不完整,但我会看看它有什么报告。我还应该注意,如果我单线程运行程序不会发生错误,它只会在多线程处理后发生。我想知道处理线程是否没有正确分离并且以某种方式“锁定”对象。
标签: c++ xcode gcc exc-bad-access delete-operator