尝试删除有效指针时的EXC_BAD_ACCESS(xcode c ++)

时间:2012-01-05 00:14:04

标签: c++ xcode gcc exc-bad-access delete-operator

我有一个名为OrdinalObjectList的模板类,它只是一个带有int和object指针键的映射。它的目的是提供一个可以通过序数键访问的对象指针集合。这是班级:

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错误。

第一遍是'FSCE :: Customer'* 0x10088e600,删除没有问题。在第二遍,d是'FSCE :: Customer'* 0x100897e00,当删除时,d导致EXC_BAD_ACCESS。我可以在调试器中访问第二个“d”的成员。即d-&gt; lifeid int 2,表示FSCE :: Customer对象是有效对象,'d'是有效指针。

我应该采取哪些步骤来追踪EXC_BAD_ACCESS的原因?

3 个答案:

答案 0 :(得分:0)

我无法确定,但是你可以删除第一项和(不存在的)第二项,而不是第0项和第一项吗?确保您删除了您认为要删除的内容。

答案 1 :(得分:0)

编辑:下面的内容不正确。

不是真正的答案,但是当我将线程数减少到4时,问题就消失了。之前我已经将线程数设置为8,boxen是Core i7,这是4个超线程核心。

我只能假设在OSX内核或LLVM中存在超线程问题。我已经将优化设置为O3,在某些时候我将关闭优化并查看它是否适用于8个线程,但与此同时,4个线程仅比8慢10%,所以我会坚持下去,以便我可以进步。

问题在于我删除的对象中有一个大数组。数组是在构造函数中创建的,并在析构函数中删除,类似于此(数据成员名称已更改):

Matrix::Matrix(int maxa, int maxb, int maxc) 
{
  asize = maxa;
  bsize = maxb; 
  csize = maxc;
  matrixsize = a * b * c;
  matrix = new double [matrixsize];
}
Matrix::~Matrix()
{
  delete [] matrix;
}

到目前为止一直很好,但是在设置矩阵中的值时我有一个错误。

void Matrix::SetValue(int a,int b,int c,double value)
{
  int index = (a * asize) + (b * bsize) + c;
  matrix[index] = value;
}

设置'maxc'的代码的另一部分中的错误意味着有时索引会比matrixsize更大,我通过添加check和throw来发现它。

void Matrix::SetValue(int a,int b,int c,double value)
{
  int index = (a * asize) + (b * bsize) + c;
  if (index >= matrixsize) throw;
  matrix[index] = value;
}

这将导致访问在构造函数中分配的内存之外的内存,并且在调用delete时,会引发EXC_BAD_ACCESS错误。奇怪的是为什么EXC_BAD_ACCESS在执行期间没有在Matrix :: SetValue中引发,但我想答案与没有边界检查数组索引偏移对堆管理器的内存边界有关。如果有人能说明我最感兴趣的话,但就目前而言,这个答案适用于那些通过网络搜索找到答案的人。

答案 2 :(得分:0)

通过启用僵尸对象可以轻松跟踪EXC_BAD_ACCESS。

对于XCode 4.x,请参阅How do I set up NSZombieEnabled in Xcode 4?

对于其他版本的XCode,您可以在互联网上找到它。