我有一个问题:
我没有明确说明“new
”和“delete
”我的C ++实例,但当目标时,它会自动调用“new
”和“delete
” c类init。有什么想法吗?
class myCppTestClass
{
public:
myCppTestClass()
{
NSLog(@"MyCpp constructor");
}
~myCppTestClass()
{
NSLog(@"MyCpp destructor");
}
};
@interface MyTestClass : NSObject
{
myCppTestClass myCppInstance;
}
@end
@implementation MyTestClass
@end
我称之为:
NSLog(@"Create an object.");
MyTestClass *objcObject = [[MyTestClass alloc] init];
NSLog(@"Object created");
[objcObject release];
objcObject = nil;
NSLog(@"Object released.");
然后我运行它,日志是这样的:
2012-11-16 12:01:18.747 iOSVersion[87248:f803] Create an object.
2012-11-16 12:01:18.749 iOSVersion[87248:f803] MyCpp constructor
2012-11-16 12:01:18.750 iOSVersion[87248:f803] Object created
2012-11-16 12:01:18.751 iOSVersion[87248:f803] MyCpp destructor
2012-11-16 12:01:18.752 iOSVersion[87248:f803] Object released.
这不是关于自动参考计数,因为它是关闭的,任何想法?非常感谢你。
同样,如果MyTestClass是这样的,那么构造函数和析构函数将不会被调用:
@interface MyTestClass : NSObject
{
myCppTestClass * myCppInstance;
}
和日志:
2012-11-16 12:22:38.710 iOSVersion[87428:f803] Create an object.
2012-11-16 12:22:38.711 iOSVersion[87428:f803] Object created
2012-11-16 12:22:38.712 iOSVersion[87428:f803] Object released.
答案 0 :(得分:4)
语言不是new
和delete
,但它会调用构造函数和析构函数。这是C ++的标准行为:当您直接或间接创建对象时,将调用包含对象的构造函数;类似地,当包含对象被释放时,所有包含的实例的析构函数也会被调用。
答案 1 :(得分:1)
new
和delete
不用于创建对象,它们用于在新分配的* RAM区域中创建对象。 myCppInstance
的数据未在堆上分配,它实际上是MyTestClass
的一部分。当您的代码创建MyTestClass
对象时,它将包含已构造的myCppTestClass
。
同样,如果您创建一个myCppTestClass
变量,该类的数据基本上是在堆栈上免费分配的。它在声明范围的末尾被解除分配(即使有例外)。
使用new
和delete
,您将获得指向对象的指针,并且您负责管理其生命周期。如果您刚刚开始学习C ++,您可能希望完全避免使用它们。在现代C ++中,最好使用make_shared
而不是new
,并且“永远不要”使用delete
。
*除非您使用的是新的