静态或者全局智能指针使用的注意几点
在C++11普及开始后,智能指针才真正的被广大的C++程序员使用,当然一些高手还有大牛还是非常轻视智能指针的,咱们不谈那个。今天只谈一谈智能指针的全局化和静态化后需要注意的几点:
一、全局化或者静态化
全局化是指这个智能指针变量是全局的,全局的智能指针变量,会产生什么样的问题呢,其实就是最担心的重复释放,然后引起程序的崩溃。最典型的就是如下:
std::shared_ptr<BaseFD> operate;
它可能产生如下几个问题:
首先是如果把同一个普通变量指针在不同的地方赋值给这个指针,
operate = std::shared_ptr<BaseFD> a(ptr);
必然会引起重复释放,造成崩溃。避免的方式就是尽量不要使用这种方式分配智能指针,而是使用std::make_shared这种机制。
其次,如果在DLL中使用全局智能指针,就要考虑库的卸载的先后顺序,特别是在库和库互相调用的情况下,就需要更好的处理智能指针的控制,防止出现在关闭时,库已经卸载但是全局变量才开始释放。这个结果同样也会产生崩溃的结果。
最后,需要处理一下全局化后在线程里的操作,防止出现半同步的现象(即计数器同步了,但是数据未同步完成,可参考智能指针多线程是否需要加锁)。这个出现崩溃的可能性倒不是多大,但可能出现数据的不同步。
静态化和此基本类似。细节上的不同不再赘述。
二、全局或静态化的智能指针指向的是全局或者静态内存区。
这个在前面遇到过,就是如果一个智能指针,其指向一个全局的数据缓冲区,在程序释放时,智能指针会释放一次内存,然后程序本身也会回收内存,引起退出时的崩溃。这和下面的本变量一样。
Byte buf[1024] = {0};
std::make_shared<byte*>ptrbuf(buf);
三、使用栈变量的指针
这个和上面说过的是一样的,如果把一局部变量或者会提前释放的类变量取指针后传递给全局或者静态的智能指针,就会由于二次释放引起崩溃。
上面提到的这三个问题中,有些问题很明显可以看出来,但有的就比较麻烦,比如库里的智能指针问题,这个如果没有一定的经验就很难查出来。多线程使用智能指针的问题,都是需要一定的时间。
迁移到CSDN上来了,有压力。不敢象原来天马行空的写了。哈哈。