我怎样才能在目标C ++中管理内存

时间:2013-10-30 09:08:40

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

我不熟悉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];

我的问题如下:

  • ObtainMyTestClassObtainMyNextTestClass哪个更好?
  • 如果我以这种方式实现和使用该类,我是否会有内存泄漏的危险?

感谢。

1 个答案:

答案 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重写为不需要外部内存管理。