【问题标题】:CopyMemory gives segmentation faultCopyMemory 给出分段错误
【发布时间】:2020-05-22 12:34:47
【问题描述】:

我的程序应该通过控制台获取输入并使用共享内存,以便另一个进程可以访问输入。 显然CopyMemory 导致了分段错误。

    std::string Input;
    std::cout << "What Text do you want to encrypt? ";
    std::getline(std::cin, Input);   

    //create named shared memory
    HANDLE shmMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, 
                                            PAGE_READWRITE, 0, 256, _T("shared_mem"));

    //view the mapped memory (makes adress space visible)
    LPCTSTR shmBuffer = (LPTSTR)MapViewOfFile(shmMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 256);

    //Copy Input into shared memory. c_str converts string to pointer to char array
    CopyMemory(shmMapFile, Input.std::string::c_str(), 256);

我想这与指针有关,但我找不到错误的原因。 那么我哪里做错了?还是我用错了函数?

提前致谢!

编辑: 将 256 更改为 Input 的实际大小并没有帮助

编辑 2: 我试图将问题最小化,以便您可以自己运行它:

#include <iostream>
#include <windows.h>
#include <tchar.h>

int main()
{
    char buffer[6] = "Hello";

    HANDLE shmMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,  
        PAGE_READWRITE, 0, 6, _T("shared_mem"));
    if (!shmMapFile == 0)
        std::cout << shmMapFile << "(CreateFileMapping) Error: "<< GetLastError() << std::endl;


    LPCTSTR shmBuffer = (LPTSTR)MapViewOfFile(shmMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 6);
    if(!shmBuffer == 0)
        std::cout << shmBuffer << "(MapViewOfFile) Error: " << GetLastError() << std::endl;


    if (!CopyMemory(shmMapFile, buffer, 6) == 0)
        std::cout << "(CopyMemory) Error: " << GetLastError() << std::endl;

} 

【问题讨论】:

  • 您确定Input 包含256 个字符吗?如果用户提供的输入数据较少怎么办?
  • CopyMemory(shmMapFile, Input.std::string::c_str(), std::min(256, Input.size()+1)); 会更安全。还要检查来自CreateFileMappingMapViewOfFile 的返回值。
  • @AnonPJ CopyMemory 接受一个指针。没有办法从通用指针知道它指向的数据有多大。这可以通过指向 C 字符串的指针来实现,因为按照惯例,这些函数会寻找一个特殊的空字符来指示数据的结尾。但通用指针不一定遵循该约定,CopyMemory 使用void*,这表明它对任何指针进行操作,而不仅仅是指向空终止字符串的指针。
  • 您是否也检查了所有函数的返回值?创建minimal reproducible example
  • 为什么使用 Input.std::string::c_str() 而不是 Input.c_str()?

标签: c++ windows segmentation-fault shared-memory


【解决方案1】:

CopyMemory 的第一个参数应该是 shmBuffer,而不是句柄。 HANDLE 表面上是一种指针数据类型,但取消引用它是获得访问冲突的可靠方法。

【讨论】:

  • 成功了!!谢谢。但我不得不将shmBuffer 更改为LPVOID,而不是将MapViewOfFile 转换为LPTSTR 类型。经过这些更改后,它起作用了。
猜你喜欢
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
相关资源
最近更新 更多