接力,智能指针也麻烦
C++的指针也不是很麻烦的东西,但是无数的人都说麻烦,弄了个智能指针来管理数据,原本就该小心的指针操作顿时变得需要耐心,细心而有毅力……
核心问题在于,智能指针的引用计数是要通过拷贝函数或者构造函数传递的,表面上看,+1-1=0,但是实际上不完全是这么回事,如果将对象分别包装两次,那这个对象也会被释放两次。问题是智能指针计数为0时的副作用——它会释放掉这个对象,这就导致了指针使用上的歧义,明明没有释放,但莫名其妙的就没了,而且如果整个程序都用智能指针的话,跟踪出来哪里实际delete了指针可能很困难。
另外存在的一个问题也很明显,如果将一个栈指针包装到智能指针里,释放的时候指不定出什么事情,但是却不能简单地指出哪些是堆上的指针,哪些是栈上的指针。为此,指针到智能指针的隐式转换也被关闭,就是要防止无知群众上当受骗。
用白话描述这种问题的根源,就是不应该擅自包装裸指针,除非是在亲手构造,否则都应该将接力棒从一个智能指针传递给另外一个。
但这还不是问题的全部,为了使用智能指针,还要防止所有的智能指针落入他人之手,内部使用的所有设备都要严格保密,内部使用,且完全一致。
于是就出现了传说中的解决方案,要么所有的地方都不用,要么删掉所有new和delete,用一个构造器来生成对象,对象由它自生自灭,于是:打字数量明显增加,心烦程度明显加大,外带构造器泛滥。
浙公网安备 33010602011771号