Objective-C中的c ++等价物[alloc [init]]

时间:2011-04-20 16:22:55

标签: objective-c pointers

我是否正确地说了相当于:

NSMutableArray *foo;
foo = [[NSMutableArray alloc] init];
[foo release];

是C ++:

NSMutableArray *foo = new NSMutableArray();
delete foo;

即。 Obj-C的第二行执行动态内存分配,而第一行只是指针?在这种情况下,[init] VS的功能是什么。 [ALLOC]

谢谢你们 - 我几乎发现一点C ++几乎是学习Obj-C的障碍!

4 个答案:

答案 0 :(得分:2)

内部C ++可以做与alloc + init非常相似的事情。在这种情况下,alloc执行实际的内存分配(new),init或多或少地作为构造函数。

答案 1 :(得分:2)

alloc相当于new()init相当于C ++对象构造函数。

答案 2 :(得分:1)

我认为与Objective-C的两阶段alloc / init相当的最接近的C ++将调用malloc来分配缓冲区,然后使用placement new来调用先前分配的内存块的构造函数:

void *buffer = malloc(sizeof(NSMutableCPPArray));
NSMutableCPPArray *foo = new(buffer) NSMutableCPPArray();

在此示例中,第一行对应alloc,为要使用的对象动态分配新的内存块。第二行类似于init,调用构造函数初始化该内存块。

当然,一个关键的区别是Objective-C的alloc / init对是标准Foundation库的基础和广泛使用的部分。相比之下,Placement是一个奇怪且很少使用的C ++加载caveats and warnings in the online C++ FAQ的角落。

答案 3 :(得分:0)

除了您展示的代码的基本语义之外,您还必须考虑给定编程语言处理内存的方式。在Objective-C中,每个对象都有一个retain-count,它在调用release时使用(并且一个对象在删除之前需要保留计数为0)。在C ++中没有这样的机制,当你使用new和delete(可能有内存泄漏)时,你必须自己处理内存。

如果你想要内存管理ala Objective-C你应该检查C ++ 0x的头部,其中包括shared_ptr对象(其行为更像是Objective-C)。