在swift 3中是否有相当于c ++的shared_ptr?

时间:2016-12-21 09:49:45

标签: c++ swift

我知道swift 3中的强(默认)和弱(弱关键字)引用,但有相同的共享引用吗?

由于

3 个答案:

答案 0 :(得分:4)

Swift中的内存管理范例与C ++不同,因为它从Objective-C继承了保留释放机制(通过ARC)。正如您所料,C ++的解决方案对编译器的责任较小,表达性和优化性更强,但使用起来也更复杂。

因此,要回答您的问题:strong(默认情况下)基本上与shared_ptr类似,weak类似于weak_ptrunique_ptr没有&#39} ; t有一个直接的等价物。但是,如果编译器能够保证指针的唯一性,那么一些强大的变量可能就像unique_ptr一样(例如,你创建并销毁同一范围内的对象 - 就像函数体的一样 - 没有指定它任何var)

当然,这仅适用于参考类型。值类型只是被复制。

答案 1 :(得分:2)

普通 vars (没有弱修饰符或无符号修饰符)具有与shared_ptr类似的语义。

答案 2 :(得分:2)

Swift应用引用的ARC (automatic reference counting)来决定何时释放引用类型实例使用的内存(即,当强引用的数量为那个对象是零)。 ARC及其引用计数自动运行,但与C ++ public static void main(String[] args) { Map<Person, List<Pet>> map ; { map = new HashMap<>(); map.put(new Person("JOHN", 10, "MALE"), Arrays.asList(new Pet[]{new Pet("Spot", 3, "Dog")})); map.put(new Person("AISEC", 12, "MALE"), Arrays.asList(new Pet[]{new Pet("Loo", 12, "Cat"), new Pet("Kitty", 4, "Cat")})); } try { // serialize map into String String serializedDict = dictToJson(map); // write to file ... System.out.println(serializedDict); map.clear(); // de-serialize from String to map map = jsonToDict(serializedDict); // check if map was built ok System.out.println(dictToJson(map)); } catch (Exception e) { e.printStackTrace(); } } 的显式使用有相似之处;后者将允许(通过共享的ptrs)指向的对象仅在指向对象的所有智能指针超出范围或已明确重置(/无效)时被销毁(例如,由提供的deletor)。

在上面的示例中,您可以将强不可变(引用)std::shared_ptrfoo(后者从bar返回)视为foobar()的等价物C ++:它们都指向相同的std::smart_ptr对象,并且只有当两者都超出范围时才会取消对象的初始化。

Foo