C++ 智能指针六

/* 智能指针unique_ptr */

#include <iostream>
#include <string>
#include <memory>
#include <vector>

/*
    unique_ptr 独占所指向的对象, 同一时刻只能有一个 unique_ptr 指向给定对象(通过禁止拷贝语义, 只有移动语义来实现), 
定义于 memory (非memory.h)中, 命名空间为 std.

unique_ptr 不支持拷贝和赋值.

*/


struct Student
{
public:
    Student(std::string name_, int age_) :name(name_), age(age_) {}
    std::string name;
    int age;
    
};


std::unique_ptr<Student> test_clone()
{
    std::unique_ptr<Student> up1 = std::make_unique<Student>("spaow",65);
    return up1;
}

struct STDeleter
{
    void operator() (int* obj)
    {
        if (obj)
        {
            for (int i = 0; i < 10; i++)
            {
                //obj[i] = i + 2;
                printf("obj[i] = %d\n", obj[i]);
            }
            free(obj);
            obj = NULL;
        }
    }
};

void test()
{
    //初始化方式一
    std::unique_ptr<Student> up1 = std::make_unique<Student>("tom",11);

    //error unique_ptr 不支持拷贝构造函数
    //std::unique_ptr<Student> up2(up1);

    //error unique_ptr 不支持赋值
    //std::unique_ptr<Student> up3 = up1;

    //初始化方式二
    std::unique_ptr<Student> up4(new Student("jack", 10));

    //初始化方式三:
    /*
    release方法: 放弃内部对象的所有权,将内部指针置为空, 返回所内部对象的指针, 此指针需要手动释放
    */
    std::unique_ptr<Student> up5(up1.release());

    //初始化方式四
    /*
     reset方法: 销毁内部对象并接受新的对象的所有权(如果使用缺省参数的话,也就是没有任何对象的所有权, 此时仅将内部对象释放, 并置为空)
    */
    std::unique_ptr<Student> up6;
    up6.reset(new Student("als", 12));

    //成员函数的使用

    //可以进行移动构造和移动赋值操作
    std::unique_ptr<Student> up7;
    up7 = std::move(up6);

    std::unique_ptr<Student> up8(std::move(up7));

    //特殊的拷贝
    std::unique_ptr<Student> up9 = test_clone();

    printf("name is [%s] .\n",up9->name.c_str());

    //在容器中保存指针
    std::vector<std::unique_ptr<Student> > vec;
    std::unique_ptr<Student> upTmp(new Student("kld",16));
    vec.push_back(std::move(upTmp));

    //unique_ptr 支持管理数组
    std::unique_ptr<int[]> ups(new int[10]);

    printf("sizeof(ups) = %d\n", sizeof(ups));//打印4,并非数组实际长度

    for (int i = 0; i < 10; i++)
    {
        ups[i] = i;
        printf("ups[i] = %d\n", ups[i]);
    }

    //自定义删除器定义
    int *tempArr = (int *)malloc(sizeof(int) * 10);
    std::unique_ptr<int, STDeleter> usp2(tempArr, STDeleter());

    int *pcIndex = usp2.get();
    for (int i = 0; i < 10; i++)
    {
        pcIndex[i] = i+2;
    }

}

int main()
{
    test();
    getchar();
    return 0;
}

 

posted on 2019-01-20 12:36  寒魔影  阅读(175)  评论(0编辑  收藏  举报

导航