C++如何只在堆上或者栈上生成对象

Posted _从未止步

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++如何只在堆上或者栈上生成对象相关的知识,希望对你有一定的参考价值。

    这个是个面试题,不知道的时候确实会一比较懵;那么具体如何实现呢?

栈和堆这两种内存的使用想象大家都了解吧,栈一般是静态建立一个对象的时候会有编译器自动创建,而堆是需要调用new来达到目的的。

    首先若是不能调用new,那么就无法在堆上生成对象了,那么...,我们重载一下operator new以及operator delete 置为私有部分,类外就无法调用new来在堆上生成对象了,所以只能在栈上生成对象了...代码如下:

class C

public:
	C()
	
		cout << "C()" << endl;
	
	~C()
	
		cout << "~C()" << endl;
	
private:
	void* operator new(size_t);
	void  operator delete(void *);
;
void Test3()

	//C *ptr = new C();
	C c;
      只在栈上生成对象是解决了,那么要想只在堆上生成对象的话,意思就是只能通过new来生成对象了。我们可以将析构函数设置为私有的,这样类外使用静态方法创建对象的时候就会报错,这样可以达到目的,于此同时需要自己提供一个接口,用于释放对象。

      但是我们知道私有函数在继承的时候是无法直接在派生类中直接调用的(而且在delete的时候会调用析构函数,这个时候也是不行的...),那么这样的话我们就考虑到了将析构函数设置为保护的,因为保护属性是转为继承而生的,这样就可以解决上述问题而且满足要求。

class B
	//只在堆上创建对象,声明为protected的无法继承
public:
	static B* Create()
	
		return new B();
	
	void Destroy()
	
		delete this;
	
protected:
	B()
	
		cout << "B()" << endl;
	
	~B()
	
		cout << "~B()" << endl;
	
;

void Test2()

	//B b;
	B *pa = B::Create();
	pa->Destroy();
这里我将构造函数设置为保护成员了,然后通过静态成员函数来完成对象的构造,通过专门的成员函数释放对象。


以上是关于C++如何只在堆上或者栈上生成对象的主要内容,如果未能解决你的问题,请参考以下文章

如何限制对象只能建立在堆上或者栈上

如何限制对象只能建立在堆上或者栈上(转载)

C++ 特殊类设计

特殊类设计

C++中栈和堆上建立对象的区别

C++中,静态数组在内存中是存储在堆上,还是栈上,还是在静态存储区中?