既然您指定了Visual C并断言,我会假设您可以使用调试版本。 在这种情况下,你可以把这个特定的编译器把内存检查fenceposts的优势:
#define IS_POINTER_TO_STACK(vp) (*((int*)(vp)-1)==0xCCCCCCCC)
工作正常,在所有这些情况下,在调试版本:
#define ASSERT(v) printf("assert: %d\n", v); //so it doesn't really quit
int g_n = 0;
void test_indirectly(void* vp) {
ASSERT(IS_POINTER_TO_STACK(vp));
}
void F() {
int *pA = &g_n;
ASSERT(IS_POINTER_TO_STACK(pA)); //0
int i = 0;
int j = 0;
int *pB = &i;
ASSERT(IS_POINTER_TO_STACK(pB)); //1
ASSERT(IS_POINTER_TO_STACK(&j)); //1
int *pC = (int*)malloc(sizeof(int));
ASSERT(IS_POINTER_TO_STACK(pC)); //0
free(pC);
ASSERT(IS_POINTER_TO_STACK(pC)); //0
pC = new int;
ASSERT(IS_POINTER_TO_STACK(pC)); //0
delete pC;
char* s = "HelloSO";
char w[6];
ASSERT(IS_POINTER_TO_STACK("CONSTANT")); //0
ASSERT(IS_POINTER_TO_STACK(s)); //0
ASSERT(IS_POINTER_TO_STACK(&w[0])); //1
test_indirectly(&s); //1
int* pD; //uninit
ASSERT(IS_POINTER_TO_STACK(pD)); //runtime error check
}
(除极最后一个由于未初始化的内存导致运行时错误 - 但仍然用于验证指针的目的)。
这只适用于Debug构建 - Release构建报告全部为false。
为什么(!)你需要这个吗? – Tim 2008-12-03 19:30:07
与蒂姆在此。你有什么可能需要这些信息? – TheSmurf 2008-12-03 19:47:07
为了模仿其他硬件并更容易陷入bug ... – 2008-12-03 20:08:43