#include <iostream>
/*
判断一个类对象在栈中还是堆中
*/
// 可以创建只允许堆区对象这样的限制
class Person
{
public:
Person()
{
if (!isInHeap)
{
throw "not in heap";
}
isInHeap = false; // 还原,若栈对象会抛出异常
}
static void *operator new(size_t size)
{
isInHeap = true; //重置
return ::operator new(size);
}
void operator delete(void *ptr)
{
return ::operator delete(ptr);
}
static void *operator new[](size_t size)
{
isInHeap = true; //重置
return ::operator new(size);
}
void operator delete[](void *ptr)
{
return ::operator delete[](ptr);
}
private:
static bool isInHeap;
};
bool Person::isInHeap = false;
void Test()
{
// Person p; //error, throw execption
Person *p = new Person;
delete p;
void *rawPtr = new Person();
Person *per1 = static_cast<Person *>(rawPtr);
delete per1;
// 若果是申请的对象数组,则会异常,一次new操作,调用10次构造函数,会抛出异常
void *rawPtrList = new Person[10];
Person *pList = static_cast<Person *>(rawPtrList);
delete[] pList;
}
// 第二种可以通过栈区内存地址从高至低,堆区从低到高
// 并且栈区地址整体大于在堆区地址特性
struct TestHeap
{
};
bool CheckIsInHeap(const void *ptr)
{
char stackVar;
return ptr < &stackVar;
}
void Test1()
{
TestHeap t;
std::cout << CheckIsInHeap(&t) << std::endl; // 0
TestHeap *ptr = new TestHeap;
std::cout << CheckIsInHeap(ptr) << std::endl; // 1
// 但static 静态变量地址是在堆区下面,比堆区整体地址更低,不能通过地址比较法来判断static类型
// 变量(有些编译器栈区、堆区、静态区地址可能不是这样分布的,地址比较法不具有可移植性)
static TestHeap *staticPtr = new TestHeap;
std::cout << CheckIsInHeap(staticPtr) << std::endl; // 1,但不能区分是堆区还是静态区
}
int main()
{
Test1();
return 0;
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交