Objective C引入了一项名为ARC的技术,使开发人员免于内存管理的负担。听起来不错,我认为如果g ++也有这个功能,C ++开发人员会非常高兴。
ARC允许您将内存管理的负担放在(Apple LLVM 3.0)编译器上,永远不要再考虑保留,发布和自动释放
所以,如果LLVM3.0可以做到这一点,我认为g ++也可以让C ++开发人员摆脱内存管理的艰巨任务,对吗?
将ARC引入C ++有什么困难吗?
我的意思是:如果我们不使用智能指针,我们只使用new
/ new[]
,编译器是否可以为我们做些什么来防止内存泄漏?例如,将新指针自动更改为智能指针?
答案 0 :(得分:21)
C ++的概念是 Resource Allocation is Initialization(RAII) &智能地使用此方法可以使您免于显式资源管理。
C ++已经提供了shared_ptr
,它提供了引用计数。
此外,还有许多其他 Smart pointers ,它们使用RAII让您的C ++生活更轻松。
答案 1 :(得分:17)
这是一个很好的问题。 ARC不仅仅是智能指针的实现。它也与垃圾收集不同,因为确实可以完全控制内存管理。
在ARC中,您确切知道何时释放对象。人们认为是不正确的原因是,你写的没有明确的“释放”电话。但是你知道什么时候编译器会插入一个。并且它不是在一些垃圾收集步骤中,它是在不再需要对象时内联的。
它包含一个编译器步骤,用于分析代码并尝试查找递增和递减引用计数的任何冗余序列。这可能是通过优化C ++编译器实现的,如果它被赋予了优化器可以看到的智能指针实现。
ARC还依赖于客观c的语义。首先,指针被注释为表示它们是强还是弱。这也可以在C ++中完成,只需要有两个不同的指针类(或使用智能和香草指针)。其次,它依赖于目标c方法的命名约定来知道它们的返回值是否应该隐式弱或强,这意味着它可以与非ARC代码一起工作(ARC需要知道你的非ARC代码是否打算返回一个对象例如,具有+1引用计数。如果您的“C ARC”没有与非“C ARC”代码并列,则您不需要这样做。ARC给你的最后一件事是,在编译时,你的代码真的很好地分析了它认为泄漏的位置。这很难添加到C ++代码中,但可以添加到C ++编译器中。
答案 2 :(得分:8)
没有必要。我们有共享指针,为我们这样做。事实上,我们有各种不同情况下的指针类型,但共享指针模仿ARC正在做的事情。
请参阅:
答案 3 :(得分:3)
使用C ++的一个原因是完全控制内存管理。如果您不希望在特定情况下,有智能指针可以为您进行管理。
存在托管内存解决方案,但在正确选择C ++的情况下(对于大型大型应用程序),它不是一个可行的选择。
答案 4 :(得分:3)
使用ARC而不是完全垃圾回收有什么好处?在委员会面前有一个关于垃圾收集的具体建议;最后,由于时间不够而无法处理,但似乎大多数委员会(如果不是真正的共识)赞成向C ++添加垃圾收集。
在全球范围内,引用计数是真正的垃圾收集的不良替代品:它在运行时方面很昂贵,并且需要特殊的代码来处理周期。但是,它适用于特定的有限情况,当程序员知道它适用时,C ++会根据程序员的要求通过std::shared_ptr
提供它。
答案 5 :(得分:3)
最近我使用Clang编写了一些Objective-C ++代码,并且惊讶地发现Objective-C指针实际上是作为C ++中的非POD类型处理的,我可以在我的C ++类中使用而没有问题。
它们实际上是在我的析构函数中自动释放的!
我用它来存储std :: vectors中的弱引用因为我想不出一种方法来保存一个弱引用的NSArrary ..
无论如何,在我看来,Clang通过在Objective-C中模拟C ++ RAII和智能指针来实现Objective-C中的ARC。考虑一下,ARC中的每个NSObject *都只是C ++中的智能指针(来自Boost的intrusive_ptr)。
我在ARC和智能指针之间看到的唯一区别是ARC内置于该语言中。除此之外,它们具有相同的语义。
答案 6 :(得分:2)
看看Qt。 Qt通过利用层次结构链实现了此功能。你可以新建一个指针并为其指定一个父级,Qt将帮助你管理内存。
答案 7 :(得分:2)
答案 8 :(得分:0)
Microsoft C ++ / CX为ref类提供ARC。 Embarcadero有2个C ++编译器,其中一个有ARC。