2

我有个问题:

我没有明确地“ new”和“ delete”我的 C++ 实例,但是当 Objective-C 类初始化时它会自动调用“ new”和“ ”。delete任何想法?

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.
4

2 回答 2

4

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

于 2012-11-16T04:11:15.810 回答
1

new在 C++中delete不用于创建对象,它们用于在新分配的 RAM 区域中创建对象。myCppInstance的数据不是在堆上分配的,它实际上是MyTestClass. 当您的代码创建一个MyTestClass对象时,它将包含一个已构建的myCppTestClass.

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

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

* 除非您使用的是新展示位置

于 2012-11-16T04:14:02.487 回答