为什么c ++实例在通过Objective-c类调用时会自动调用构造函数和析构函数?

时间:2012-11-16 04:03:36

标签: c++ objective-c objective-c++

我有一个问题:

我没有明确说明“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.

2 个答案:

答案 0 :(得分:4)

语言不是newdelete,但它会调用构造函数和析构函数。这是C ++的标准行为:当您直接或间接创建对象时,将调用包含对象的构造函数;类似地,当包含对象被释放时,所有包含的实例的析构函数也会被调用。

答案 1 :(得分:1)

C ++中的

newdelete不用于创建对象,它们用于在新分配的* RAM区域中创建对象。 myCppInstance的数据未在堆上分配,它实际上是MyTestClass的一部分。当您的代码创建MyTestClass对象时,它将包含已构造的myCppTestClass

同样,如果您创建一个myCppTestClass变量,该类的数据基本上是在堆栈上免费分配的。它在声明范围的末尾被解除分配(即使有例外)。

使用newdelete,您将获得指向对象的指针,并且您负责管理其生命周期。如果您刚刚开始学习C ++,您可能希望完全避免使用它们。在现代C ++中,最好使用make_shared而不是new,并且“永远不要”使用delete

*除非您使用的是新的