
这个是一个比较冷门的知识点,目前个人整理出了几种办法。
1.只分配在栈上:对new关键字重载并放在protected域
因为C++只有用new的关键字生成的对象才是放在堆上的,现在可以对new进行重载,将其放在private内,这样我们就调用不了new,这样也就可以限制程序将类对象分配到堆里头了。而由于new跟delete是配套出现的,重载new还需要重载delete。
参考链接:《More Effective C++》条款27:如何让类对象只在栈(堆)上分配空间?_hxz_qlh的博客-CSDN博客
class A
{
protected:
void* operator new(size_t t){} // 注意函数的第一个参数和返回值都是固定的
void operator delete(void* ptr){} // 重载了new就需要重载delete
public:
A(){}
~A(){}
};
2.只分配在堆上:将析构函数放在privete域
编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。因此,将析构函数设为私有,类对象就无法建立在栈上了。
class A
{
public:
A(){}
void destory(){delete this;}
private:
~A(){}
但是这个时候不能用delete,只能手动调用destory函数释放内存了。
3.借鉴单例模式思想:只用函数去生成对象或释放内存
将构造函数放置到private域当中,然后通过一个静态函数去控制分配在栈上还是堆上。
class Point1
{
protected:
Point1() {};//将构造函数私有化
public:
~Point1() {}
int k = 9;
static Point1 Produce1() {//控制分配在栈上
Point1 p;
return p;
}
static Point1* Produce2() {//控制分配在堆上
Point1 *p=new Point1;
return p;
}
};
二、关于inline函数的优缺点
参考自:C++中的inline用法 - Boblim - 博客园
inline_百度百科
内联函数 —— C 中关键字 inline 用法解析_zqixiao_09的博客-CSDN博客_c语言 inline
1.inline函数的基本介绍
1)引入初衷:
2)运行原理
2.相对宏定义的优点
即上面运行原理的点2和点3.
3.使用注意事项
尽管是否使用内联是编译器说的算(有的编译器会识别在内联函数超过一定长度后调用栈),但我们仍要小心使用,尤其别在里头放太多的代码或是调用复杂的迭代和递归,容易内存爆炸。
三、智能指针的循环引用问题参考链接:C++ 智能指针(及循环引用问题)_Fly_bit的博客-CSDN博客
C++智能指针循环引用问题分析_swings_ss的博客-CSDN博客_智能指针循环引用
智能指针的循环引用问题,简单来说就是仅仅有shared_ptr会造成循环引用现象导致智能指针无法发挥其自动释放空间的功能。这时候需要使用weak_ptr来解决这种循环引用的现象。
除此之外补充一个:关于auto_ptr为什么要删除可参考:
auto_ptr - 简书
auto_ptr的缺陷在哪里?为什么不应该用? - 知乎