【C++】auto_ptr在单例模式中的应用,宏实现sizeof与align

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43912621/article/details/131288892