c++ - CreateFile2、WriteFile 和 ReadFile : how can I enforce 16 byte alignment?

标签 c++ dangling-pointer

我正在使用 CreateFile2 和 WriteFile 创建和写入文件,然后使用 readfile 一次将 16 个字节读入 __m128i,然后对其执行 simd 操作。在 Debug模式下工作正常,但在 Release模式下抛出拒绝访问(0xc0000005)错误代码。根据我的经验,当我试图将非 16 字节对齐的内容插入 16 字节对齐的内容时,就会发生这种情况。但是,我不确定缺少 16 字节对齐首先是在什么地方出现的。

#define simd __m128i

它在 CreateFile2() 调用中吗?

_CREATEFILE2_EXTENDED_PARAMETERS extend = { 0 };
extend.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS);
extend.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
extend.dwFileFlags = /*FILE_FLAG_NO_BUFFERING |*/ FILE_FLAG_OVERLAPPED;
extend.dwSecurityQosFlags = SECURITY_ANONYMOUS;
extend.lpSecurityAttributes = nullptr;
extend.hTemplateFile = nullptr;

hMappedFile = CreateFile2(
    testFileName.c_str(),
    GENERIC_READ | GENERIC_WRITE,
    0,
    OPEN_ALWAYS,
    &extend);

...在 WriteFile() 调用中?

_OVERLAPPED positionalData;
positionalData.Offset = 0;
positionalData.OffsetHigh = 0;
positionalData.hEvent = 0;

bool writeCheck = WriteFile(
    hMappedFile,
    &buffer[0],
    vSize,
    NULL,
    &positionalData);

...在后面的 ReadFile() 调用中?

const simd* FileNodePointer(
    _In_ const uint32_t index) const throw()
{
    std::vector<simd> Node(8);

    _OVERLAPPED positionalData;
    positionalData.Offset = index;
    positionalData.OffsetHigh = 0;
    positionalData.hEvent = 0;

    ReadFile(
        hMappedFile,
        (LPVOID)&Node[0],
        128,
        NULL,
        &positionalData);

    return reinterpret_cast<const simd*>(&Node[0]);
}

如何在此处强制执行 16 字节对齐?

谢谢!

最佳答案

TL;DR 你有一个经典的“释放后使用”错误。


这些函数都不需要 16 字节对齐。如果启用缓冲,他们根本不关心对齐,如果启用直接 I/O,他们需要比 16 字节更严格的页面对齐。

如果您的数据缓冲区未对齐,那是因为您以这种方式创建了它。文件 I/O 不会移动内存中的缓冲区。

但是你的访问冲突根本不是由对齐问题引起的,它是你从 FileNodePointer 返回的悬挂指针:

return reinterpret_cast<const simd*>(&Node[0]);

这是指向具有自动生命周期的 vector 内容的指针, vector 析构函数在函数返回过程中运行,并释放包含您刚刚从文件中读取的数据的内存。

关于c++ - CreateFile2、WriteFile 和 ReadFile : how can I enforce 16 byte alignment?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40245461/

相关文章:

c++ - 在笔记本电脑上开发没有 GPU 支持的 OpenCL 应用程序?

c - C 中的埃拉托色尼筛法算法

C++使用指针,没有传递任何内容

c++ - 标准 vector 和 boost 数组 : which is faster?

c++ - 比较悬空指针是否合法?

c++ - 是否可以在其范围之外访问局部变量的内存?

c++ - 删除指针和将其设置为 nullptr 之间有什么区别?

C 释放检查不起作用

c++ - 当您将位移超出变量的末尾时会发生什么?

c++ - Lambda 捕获 shared_ptr 成员