#include "stdafx.h"
#include "EvenMemAlloc.h"
#include <stdlib.h>
#include <windows.h>
// 在Windows系统下
#ifdef _WIN32
#define MARK_SIZE 2
#define EVEN_MEM_FLAG 0
#define ODD_MEM_FLAG 1
void* EvenMemAlloc(size_t szSize)
{
BYTE* pRealMem = static_cast<BYTE*>(malloc(szSize + MARK_SIZE));
if (NULL == pRealMem)
{
return NULL;
}
void* pRetMem = NULL;
// 若为奇数地址的内存
if (reinterpret_cast<int>(pRealMem) & 1)
{
// 加1变成偶数地址
pRetMem = pRealMem + 1;
// 返回地址的前一个地址存储其真实地址类型为奇数地址
*pRealMem = ODD_MEM_FLAG;
}
// 若为偶数地址内存
else
{
// 加2仍为偶数地址
pRetMem = pRealMem + 2;
// 返回地址的前一个地址存储其真实地址类型为偶数地址
*(pRealMem + 1) = EVEN_MEM_FLAG;
}
return pRetMem;
}
void EvenMemFree(void* pMem)
{
if (NULL == pMem)
{
return;
}
void* pRealMem = NULL;
// 若真实地址为奇数地址
if (ODD_MEM_FLAG == *(static_cast<BYTE*>(pMem) - 1))
{
pRealMem = static_cast<BYTE*>(pMem) - 1;
}
// 若真实地址为偶数地址
else
{
pRealMem = static_cast<BYTE*>(pMem) - 2;
}
free(pRealMem);
pRealMem = NULL;
}
// 在其他系统下(如:Linux)
#else
void* EvenMemAlloc(size_t szSize)
{
void* pRetMem = NULL;
if (posix_memalign(&pRetMem,sizeof(void*),szSize))
{
return NULL;
}
return pRetMem;
}
void EvenMemFree(void* pMem)
{
free(pMem);
pMem = NULL;
}
#endif