我很好奇,因为我开始采用更多的提升成语,看起来是最佳实践我不知道我的C++在什么时候甚至远程看起来像过去的C++,经常在典型的例子和头脑中找到那些没有被引入“现代C++”的人?一旦你采用boost的智能指针,是否有任何情况下使用原始指针?
回答
短短几关我的头顶:
- 在内存映射文件浏览各地。
- Windows API调用必须过度分配(如LPBITMAPINFOHEADER)。
- 任何代码,你在任意内存(虚拟查询()等)周围。
- 只是你正在使用的一个指针的reinterpret_cast <>的任何时间。
- 任何时候您使用placement-new。
这里的常见问题是“任何情况下,您需要将一段内存视为除您拥有分配控制的资源之外的其他内容”。
这几天我几乎放弃了所有使用原始指针。我甚至开始通过我们的代码库来查看使用原始指针的地方,并将它们切换为智能指针变体。通过这个简单的行为,我能够删除多少代码是令人惊讶的。原生C++指针的生命周期管理浪费了太多的代码。
我不使用指针的唯一地方是与其他代码库的几个互操作场景,我没有控制权。
我还是用在需要占用空间小,如某些例外情况,在那里我可以不承担任何数据是有效的,也必须承担,我运行内存过于资源敏感的代码或其他代码的常规指针。
托管内存几乎总是优于原始数据,因为这意味着您不必在正确的位置删除它,但仍可以很好地控制指针的构造和销毁点。
哦,还有一个其他地方使用的原始指针:
boost::shared_ptr<int> ptr(new int);
如果您有圆形的数据结构,例如,A点到B点和B点回到A,则不能使用简单地使用A和B的智能指针,从那时起对象只会被释放额外的工作。为了释放内存,您必须手动清除智能指针,这与删除智能指针所消除的差不多。
你也许事情并不经常发生,但假设您具有智能指针一堆的子对象的父对象。在某个程序中,有人需要查找孩子的父母,因此他们将智能指针成员添加到孩子,并指向父母。无言以对,内存不再释放。
需要注意一些事情。智能指针不等于垃圾收集。
这就是boost :: weak_ptr的用途,如果你有它的话。所以你仍然可以使用智能指针而不是原始的,只是不是所有的智能指针都是shared_ptr。 – 2008-12-12 18:13:12
绝对boost :: weak_ptr是解决循环引用问题的另一种方法,但我认为我的观点仍然存在:您必须注意,不要盲目使用任何智能指针。 – 2008-12-12 18:49:27
我几乎根本不使用shared_ptr
,因为我通常避免共享所有权。因此,我使用类似boost::scoped_ptr
的东西来“拥有”一个对象,但所有其他对它的引用都将是原始指针。例如:
boost::scoped_ptr<SomeType> my_object(new SomeType);
some_function(my_object.get());
但是some_function
将处理原始指针:
void some_function(SomeType* some_obj)
{
assert (some_obj);
some_obj->whatever();
}
我仍然使用原始指针上已存储器映射的IO设备,诸如嵌入式系统,其中,具有智能指针没有按”这真的很有意义,因为你永远不需要或能够达到这个目的。
我发现'现代'C++和旧*东西之间的主要区别是小心使用类不变量和封装。组织良好的代码自然会有更少的指针飞来飞去。我几乎像在新闻和删除中一样在shared_ptrs中游泳。
我很期待在C++ 0x中的unique_ptr
。我认为这将清理仍然漫游的少数(聪明)指针。
*仍然遗憾的是很常见的
当然,任何你正在处理遗留库,否则你会需要通过原始指针API,虽然你可能只是从你的智能指针提取它暂时的时间。
事实上它始终是安全的原始指针传递给一个函数,只要功能不尽量保持指针的副本,全局或成员变量,或尝试将其删除。有了这些限制,函数不会影响对象的生命周期,并且智能指针的唯一原因是管理对象生存期。
我正在写有C++共存目标C(使用Objective C++桥接)。 因为作为Objective C++类的一部分声明的C++对象没有调用的构造函数或析构函数,所以您不能在智能指针中使用它们。
所以我倾向于使用原始指针,虽然经常用的boost :: intrustive_ptr和内部的引用计数。
不,我会做,但你需要实现,比方说,一个链接列表或图形原始指针。但是使用std::list<>
或boost::graph<>
会更聪明。
- 1. 用智能指针替换现有的原始指针
- 2. Boost智能指针
- 3. Boost智能指针和std智能指针有什么区别?
- 4. 使用boost :: swap交换原始指针?
- 5. OpenCV或Boost智能指针
- 6. 如何在不使用指针的情况下模拟指针?
- 7. 在智能指针的bimap中查找原始指针
- 8. 从原始指针转换为智能指针
- 9. 集成智能指针遗留代码原始指针
- 10. 从原始指针/参考创建智能指针
- 11. Boost中的作用域指针:什么意思是一个原始指针?
- 12. std :: get_temporary_buffer返回的是原始指针而不是智能的指针
- 13. 什么时候应该在智能指针上使用原始指针?
- 14. Java中是否有“智能指针”?
- 15. C++:识别原始指针使用情况的统计信息
- 16. C++和智能指针 - 智能指针如何在这种情况下提供帮助?
- 17. 指针和智能指针的区别
- 18. Boost python,将原始指针与托管指针进行比较?
- 19. Qt智能指针相当于Boost :: shared_ptr?
- 20. Boost智能指针和线程
- 21. 调用一个成员函数指针的智能指针
- 22. Boost-Python原始指针构造函数
- 23. 如何使用C++智能指针?
- 24. 智能指针代替指针
- 25. 虚空指针到智能指针
- 26. 将原始指针和智能指针的容器传递给模板函数
- 27. 使用指针:指针指针指针
- 28. C++智能指针
- 29. 与智能指针
- 30. 获取智能指针的指针指针
我以为有没有开销与boost:指针类?编译器不会优化所有的东西吗? – ApplePieIsGood 2008-12-12 18:53:49
有限范围的指针类没有大量开销,但它必须存在,并且共享指针需要引用计数和关联的机制。我总是遵循规则1;首先配置文件,然后优化。 – coppro 2008-12-12 19:17:36
无法想象我需要在堆上明确分配单个int的15年C++编码的单个时间。 int:s的数组是另一回事,但总是有std :: vector。 –
2008-12-21 00:27:33