我不熟悉Objective c ++,这是我的问题:假设我有一个类
class MyTestClass
{
public:
int memLength_;
char *mem;
MyTestClass(int memLength)
{
memLength_ = memLength;
mem = new char[memLength_];
}
~MyTestClass()
{
delete []mem;
}
}
现在我想要做的是使用Objective C ++创建一个MyTestClass
对象,我所做的如下:
@interface ObjectRetriever : NSObject
+ (MyTestClass)ObtainMyTestClass; // Function 1
+ (MyTestClass*)ObtainMyNextTestClass; //Function 2
@end
+(MyTestClass)ObtainMyTestClass
{
int memLen = 100;
MyTestClass myClass(memLen)
return myClass;
}
+ (MyTestClass*)ObtainMyNextTestClass
{
MyTestClass *myClassPtr;
myClassPtr = new MyTestClass(memLen)
return myClassPtr;
}
所以,当我使用ObjectRetriever
创建MyTestClass
对象时,我会这样做
MyTestClass testClassObject1 = [ObjectRetriever ObtainMyTestClass];
MyTestClass *testClassObjectPtr2 = [ObjectRetriever ObtainMyNextTestClass];
我的问题如下:
ObtainMyTestClass
和ObtainMyNextTestClass
哪个更好?感谢。
答案 0 :(得分:0)
首先,简要回答您的具体问题
如果我以这种方式实现和使用该类,我是否会有内存泄漏的危险?
是。如果将来不删除[] int数组,它将会丢失。此外,在第二个(指针)实现中,您可能还会丢失MyTestClass实例。
ObtainMyTestClass和ObtainMyNextTestClass,哪一个更好?
ObtainMyTestClass,因为没有丢失MyTestClass实例的危险。
现在很长一段时间。主要问题是我不清楚你真正想要的是什么。问题标题表明您希望干净地管理(即保留/释放)您的数据。但是,在描述中,您声明数据是由您的类的用户手动管理的,您希望这样。然后,在您的代码示例中,您尝试混合使用两者(数组新建由ObjectRetriever自动完成,数组删除由用户决定)。所以,这是我的建议:
a)如果您希望内存管理由用户决定,则不需要Objective-C Wrapper类。在使用Objective-C ++时,您可以使用与C ++完全相同的MyTestClass,就像在第二个代码块中一样。
b)如果你想要安全的内存管理,并且你不能或不想改变MyTestClass,我建议在objC对象的init和dealloc中包装int数组的创建和删除。这应该与ARC一起使用。
@interface TestClassWrapper :NSObject{
int* array;
}
-(MyTestClass) getTestClass;
@end
@implementation TestClassWrapper
-(id)init{
if(![super init])return nil;
array=new int[100];
return self;
}
-(void)dealloc{
delete[] array;
[super dealloc];
}
-(MyTestClass)getTestClass{
return MyTestClass(100,array);
}
}
@end
c)如果您想要安全的内存管理,并且您可以并且想要更改MyTestClass,我建议将MyTestClass重写为不需要外部内存管理。