Memcpy崩溃取决于指针类型

时间:2014-01-27 23:51:38

标签: c++ macos crash memcpy

我正在使用这个辅助函数将不同的数据类型打包到一个缓冲区中:

template <class T>
static inline void PushBack(T& value, void*& buffer) {
    T* typedBuffer = (T*)buffer;
    memcpy(buffer, &value, sizeof(value));
    typedBuffer++;
    buffer = typedBuffer;
}

我正在调用一个带有12B和16B向量(3或4个浮点数)的循环,它工作正常。

但是,我的其他方法不是:

template <class T>
static inline void PushBack(T& value, void*& buffer) {
    T* typedBuffer = (T*)buffer;
    memcpy((T*)buffer, &value, sizeof(value)); //crash on 16B
    typedBuffer++;
    buffer = typedBuffer;
}

template <class T>
static inline void PushBack(T& value, void*& buffer) {
    T* typedBuffer = (T*)buffer;
    memcpy(typedBuffer, &value, sizeof(value)); //crash
    typedBuffer++;
    buffer = typedBuffer;
}

template <class T>
static inline void PushBack(T& value, void*& buffer) {
    T* typedBuffer = (T*)buffer;
    *typedBuffer = value; //crash
    typedBuffer++;
    buffer = typedBuffer;
}

在使用EXC_BAD_ACCESS(EXC_I386_GPFLT)预先复制总量36B之后,这三个示例在复制16B值时总是崩溃。

这是在intel上运行并编译为发布(最快,最小)。我还无法检查装配中发生了什么。

当我只复制16B向量时,问题不会发生,所以我认为这与指针未与16B对齐的事实有关。我可以在最后一种情况下理解它(通过指针复制到指针),但为什么它在memcpy中很重要?

1 个答案:

答案 0 :(得分:1)

已解决 - 在一个案例中,来自外部库的结构强制对齐。