一:禁止在堆上分配内存
#include <iostream>
#include <list>
#include <map>
#include <mutex>
using namespace std;
class A
{
private:
static void* operator new(size_t size);
static void operator delete(void* phead);
static void* operator new[](size_t size);
static void operator delete[](void* phead);
};
int main()
{
/*检测内存泄漏*/
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
/*如何强制类对象不可以或只可以在堆上分配内存
只需要重载下new和delete运算符即可。
*/
A* p = new A(); //不可以
A* q = new A[10]();//不可以
delete p;
delete[]q;
A obj;//可以
return 0;
}
二:禁止在栈上分配内存
#include <iostream>
#include <list>
#include <map>
#include <mutex>
using namespace std;
class A
{
public:
void destroy()
{
delete this;
}
void destroysz()
{
delete[] this;
}
private:
~A() {}
//A(){}
};
int main()
{
/*检测内存泄漏*/
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
/*
提高将构造函数或者析构函数设置为private
*/
A obj; //不可以
A* p = new A(); //可以
A* q = new A[10]();//可以
//delete p;//不可以
//delete[]q;//不可以
p->destroy();
q->destroysz();
return 0;
}
本文介绍了两种C++编程技巧,一是禁止在堆上分配内存,通过重载`new`和`delete`运算符实现;二是禁止在栈上分配内存,通过设置析构函数为私有并提供自定义的销毁方法。这两个技巧有助于内存管理,防止不当的内存分配导致的问题。
970

被折叠的 条评论
为什么被折叠?



