将struct timespec添加到类(几乎没有其他类型)会导致EXEC_BAD_ACCESS

时间:2018-08-19 07:40:31

标签: c++ ios xcode

我正在尝试使用sys/time.h

确定我的引擎正在运行的dt

我想我可以通过将struct timespec存储为Engine类的私有成员来实现此目的,但是这会在代码的完全不相关的部分中引起EXEC_BAD_ACCESS。

奇怪的是,我可以在不引起崩溃的情况下在其位置添加私有int,long和void *参数。

以下是相关部分。

class Engine {
private:
    static Engine* instance;

    Engine();

    struct timespec last;

public:
    static Engine* shared() {
        if (!instance) {
            instance = new Engine();
        }
        return instance;
    }

    Engine(const Engine&) = delete;

    // EntityManager
    EntityManager entityManager;
    bool setCount(int num);

};

是的,这是分配给堆的信号量。这样做是有很重要的原因的。

仅添加最后一个会在其初始化代码内部的EntityManager方法中导致EXEC_BAD_ACCESS,它会分配大量内存,然后分配每个调用其defalut构造函数的对象,如下所示:

for (int i = activeCount; i < realCount; i++) {
        char* entityStart = pool + sizeof(Entity) * i;

        new(entityStart) Entity(i+1);
}

EXEC_BAD_ACCESS显示为位于我创建的默认Entity类的第一行。第一行只是设置实体的属性。

这对我来说很混乱,尤其是因为可以添加struct timespec以外的其他类型而没有问题。所以我想知道是什么原因造成的。你有什么想法?这可能是某种编译器问题吗?

1 个答案:

答案 0 :(得分:0)

好的,所以我最终解决了这个问题,它可能不仅仅是其他事情。如果您遇到此问题,请检查以下内容:

  • 当您不期望重建器被调用时,
  • 您是否正在初始化所有需要它的字段,例如int
  • 您是否正在将malloc与posix_memalign混合使用(我停止这样做了,但是我不确定那完全可以)

祝你好运!