Skip to content

Latest commit

 

History

History
66 lines (51 loc) · 1.87 KB

如何只在堆上或栈上创建对象.md

File metadata and controls

66 lines (51 loc) · 1.87 KB
  1. 只在堆上创建

    在堆上和在栈上创建对象都需要调用构造函数进行对象的构造,但是A a;是在栈上创建对象,A *a = new A;是在堆上创建对象

    两者都要调用构造函数

    在栈上创建对象时,编译器会检查析构函数的可见性,如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。

    所以我们只需要将析构函数私有化就可以组织直接创建对象了。由于堆上创建需要释放内存,所以若是析构函数,自然会内存泄漏。

    当然为了我们能够正确释放动态创建的对象,我们必须提供一个公有函数,该函数的唯一功能就是删除对象本身

    #include<iostream>
    using namespace std;
    class test
    {
    private:
    	~test(){ cout << "test destroy" << endl; }
    public:
    	void destroy()
    	{
    		delete this;
    	}
    };
    int main()
    {
    	//test p;//编译器报错test::~test()不可访问
    	test *p = new test;
    	p->destroy();
    }
  2. 只在栈上创建

    其实理解了这个理念,不难想到我们只需要 **让new操作符无法使用即可,**要做到这件事,我们可以将 new操作符重载并设置为私有访问即可。是不是很巧妙的方法~

    重载new的同时最好重载delete

    #include<iostream>
    using namespace std;
    class test
    {
    private:
    	void* operator new(size_t t){}
    	void operator delete(void* ptr){}
    public:
    	~test()
    	{
    		cout << "test destroy" << endl;
    	}
    };
    int main()
    {
    	//test *A = new test;
    	//编译器报错函数test::operator new 不可访问
    	test A;
    }