如何让类对象只在栈(堆)上分配空间?
只能在堆上分配
class A {
public:
A() {}
void destory() { delete this; }
private:
~A() {}
};
编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。
若是类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。
如果在栈空间分配,会提示类的析构函数不可访问。
下面的写法更优。
代码看起来更统一,调用create函数在堆上创建,调用destory函数来释放。
class A
{
protected:
A(){}
~A(){}
public:
static A* create()
{
return new A();
}
void destory()
{
delete this;
}
};
只能在栈上分配
class A
{
private:
void* operator new(size_t t){} // 注意函数的第一个参数和返回值都是固定的
void operator delete(void* ptr){}
public:
A(){}
~A(){}
};
只有使用new运算符,对象才会创建在堆上,所以,只要禁用new运算符就能够实现类对象只能创建在栈上。
一个事实:new operator 先调用 operator new,所以,将operator new()设为私有便可禁止对象被new在堆上。
如果在堆空间分配,会提示operator new不可访问。
上面的方式,可以在全局空间创建对象。
构造函数私有化,提供一个接口创建栈对象。
class StackOnly
{
public:
static StackOnly CreateObject()
{
return StackOnly();
}
private:
StackOnly()
{}
};

浙公网安备 33010602011771号