c++积累

3.










static_cast < type-id > ( expression )

该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
它主要有如下几种用法:   
①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。   进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;   进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。 

②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。

③把空指针转换成目标类型的空指针。  

④把任何类型的表达式转换成void类型。  
注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。

2   shared_ptr智能指针

std::shared_ptr<int> p1(new int(5)); //p1是一个智能指针   指向的类型是int    并且是新分配的 大小是5个整形

为了解决C++内存泄漏的问题,C++11引入了智能指针(Smart Pointer)。C++11提供了三种智能指针:std::shared_ptr, std::unique_ptr, std::weak_ptr,使用时需添加头文件<memory>。shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。每使用他一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,删除所指向的堆内存。shared_ptr内部的引用计数是安全的,但是对象的读取需要加锁。

使用shared_ptr需要注意的问题

  但凡一些高级的用法,使用时都有不少陷阱。

  • 不要用一个原始指针初始化多个shared_ptr,原因在于,会造成二次销毁,如下所示:
        int *p5 = new int;
        std::shared_ptr<int> p6(p5);
        std::shared_ptr<int> p7(p5);// logic error
  • 不要在函数实参中创建shared_ptr。因为C++的函数参数的计算顺序在不同的编译器下是不同的。正确的做法是先创建好,然后再传入。
    function(shared_ptr<int>(new int), g());
  • 禁止通过shared_from_this()返回this指针,这样做可能也会造成二次析构。
  • 避免循环引用。智能指针最大的一个陷阱是循环引用,循环引用会导致内存泄漏。解决方法是AStruct或BStruct改为weak_ptr。

struct AStruct;
struct BStruct;

struct AStruct {
    std::shared_ptr<BStruct> bPtr;
    ~AStruct() { cout << "AStruct is deleted!"<<endl; }
};

struct BStruct {
    std::shared_ptr<AStruct> APtr;
    ~BStruct() { cout << "BStruct is deleted!" << endl; }
};

void TestLoopReference()
{
    std::shared_ptr<AStruct> ap(new AStruct);
    std::shared_ptr<BStruct> bp(new BStruct);
    ap->bPtr = bp;
    bp->APtr = ap;
}


猜你喜欢

转载自blog.csdn.net/m0_37407756/article/details/75674531