导航

使用智能指针代替裸指针

Posted on 2024-04-25 17:32  Hosseini  阅读(17)  评论(0编辑  收藏  举报

首先要考虑为什么使用指针,为什么不用引用;其次,无法避免使用指针的情况下,对于new出来的指针用智能指针。

(1)实现多态

虽然大多数程序员会使用指针去实现,其实可以使用引用

class BaseObj
{
public:
    BaseObj() {};
    virtual void printType() = 0;
};

class AObj :public BaseObj
{
public:
    AObj() {};
    void printType() override
    {
        cout << "AObj"<<endl;
    }
};

class BObj :public BaseObj
{
public:
    BObj() {};
    void printType() override
    {
        cout << "BObj" << endl;
    }
};

void printObj(BaseObj* pObj)
{
    pObj->printType();
}
void printObj(BaseObj& obj)
{
    obj.printType();
}
int main()
{
    AObj a;
    BObj b;
    printObj(&a);
    printObj(&b);
    printObj(a);
    printObj(b);
}

(2)需要使用堆空间:

堆空间:空间较大,可以共享,分配速度较慢,需要程序员自己管理,有内存泄漏的风险
栈空间:空间较小,系统管理,分配速度较快,有溢出的风险

class MyClass
{
public:
    MyClass() {}
};
int main()
{
    MyClass* p = new MyClass();//
    unique_ptr<MyClass> sPtr = make_unique<MyClass>();//
    MyClass cls{};//
    delete p;
}

那上述到底是选用堆还是栈呢?需要考虑MyClass的大小。window给每个线程分配的栈空间默认是1M。
如下图,会出现如下的提示:

 应该使用智能指针代替裸指针在堆上分配:

class MyClass
{
public:
    MyClass() {}
    double arr[100000000];
};
int main()
{
    unique_ptr<MyClass> sPtr = make_unique<MyClass>();//
    return 0;
}

当然堆上的空间也不是无限的,还是要合理设计(模块化设计、避免太深的递归等)。
(3)大小是动态的
  请使用STL的容器