![](/img/trans.png)
[英]`VirtualAllocEx` returns same address when specifying different start addresses?
[英]MapViewOfFile returns different addresses with same handle
我正在嘗試通過共享內存為學校作業實現IPC。 我制作了一個名為SharedMemoryBuffer
的類來處理創建文件映射和視圖。
我的Init()
函數如下所示:
BYTE * SharedMemoryBuffer::Init(const wchar_t * name, size_t bufferSize)
{
FileMapHandle = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
name); // name of mapping object
if (FileMapHandle == NULL)
{
FileMapHandle =
CreateFileMapping(INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
bufferSize,
name);
pBuf = (BYTE*)MapViewOfFile(FileMapHandle, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
bufferSize);
}
else
{
pBuf = (BYTE*)MapViewOfFile(
FileMapHandle,
FILE_MAP_ALL_ACCESS,
0,
0,
bufferSize
);
}
return this->GetBuffer();
}
本質上,我為它傳遞了名稱和大小,並嘗試使用此名稱打開映射。 如果失敗,則創建它。
我這樣稱呼它- this->ringBuffer.Init(widestr.c_str(), buffSize);
完成此操作后(從同一過程中,我對2個緩沖區調用Init 4次),打印出緩沖區的地址( Init()
pBuf
),但它們都是不同的地址。
我不能為一生的愛弄清楚為什么地址會有所不同! 我已經確保第二次使用與確實打開文件映射相同的名稱調用Init()
。
您在過程中兩次映射同一區域。 您將獲得兩個不同的地址,但是它們由相同的物理內存支持。 寫入第一個地址指向的緩沖區會修改第二個地址指向的緩沖區,因為它們實際上是相同的內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.