我是否正确地说了相当于:
NSMutableArray *foo;
foo = [[NSMutableArray alloc] init];
[foo release];
是C ++:
NSMutableArray *foo = new NSMutableArray();
delete foo;
即。 Obj-C的第二行执行动态内存分配,而第一行只是指针?在这种情况下,[init] VS的功能是什么。 [ALLOC]
谢谢你们 - 我几乎发现一点C ++几乎是学习Obj-C的障碍!
答案 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)。