auto_ptr
auto_ptr 是C++标准库提供的类模板,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同时被分给两个拥有者。当auto_ptr对象生命周期结束时,其析构函数会将auto_ptr对象拥有的动态内存自动释放。即使发生异常,通过异常的栈展开过程也能将动态内存释放。auto_ptr不支持new 数组。auto_ptr构造时取得某个对象的所有权,在析构时释放该对象。我们实际上是创建一个auto_ptr类型的局部对象,该局部对象析构时,会将自身所拥有的指针空间释放,所以不会有内存泄露。
auto_ptr在单例模式中的应用
#include <iostream>
#include <memory>
using namespace std;
class Singleton
{
public:
static Singleton* GetInstance()
{
if (!instance_.get())
{
instance_ = auto_ptr<Singleton>(new Singleton);
}
return instance_.get();
}
~Singleton()
{
cout << "~Singleton..." << endl;
}
private:
Singleton(const Singleton& other);//拷贝构造函数声明为私有 禁止拷贝
Singleton& operator=(const Singleton& other);//=运算符声明为私有 禁止拷贝
Singleton()
{
cout << "Singleton..." << endl;//只调用了一次说明只创建了一个对象
}
static auto_ptr<Singleton> instance_;
};
auto_ptr<Singleton> Singleton::instance_;//定义性说明
int main()
{
//Singleton s1;
//Singleton s2;
Singleton* s1 = Singleton::GetInstance();
Singleton* s2 = Singleton::GetInstance();
//Singleton::free();
return 0;
}
宏实现sizeof与align
#include <iostream>
#include <memory>
using namespace std;
//两个指针相减,得到的是相隔几个元素
#define sizeof_v(x) (char*)(&x+1) - (char*)(&x)
#define sizeof_t(t) ((size_t)((t*)0+1))
//内存池
//内存池内存块大小规则 不规则容易产生空隙碎片 需要对齐
//对齐 b为2的n次幂 向上对齐 超出部分抹除 16低4位置0 32低5位置0
#define ALIGN(v,b) ((v+b-1)&~(b-1))
class Empty
{
};
int main()
{
int n;
Empty e;
cout << sizeof_v(n) << endl;
cout << sizeof_v(e) << endl;
cout << sizeof_t(int) << endl;
cout << sizeof_t(Empty) << endl;
cout << ALIGN(3, 16) << endl;
cout << ALIGN(23, 32) << endl;
cout << ALIGN(74, 64) << endl;
return 0;
}