0

我不熟悉objective c++,这是我的问题:假设我有一堂课

class MyTestClass
{
 public:
  int memLength_;
  char *mem;
  MyTestClass(int memLength)
  {
      memLength_ = memLength;
      mem = new char[memLength_];
   }
   ~MyTestClass()
   {
      delete []mem;
   }

}

现在我要做的是MyTestClass使用Objective C++创建一个对象,我所做的如下:

@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,哪个更好?
  • 如果我这样实现和使用类,会不会有内存泄漏的危险?

谢谢。

4

1 回答 1

0

首先,对您的具体问题的简短回答

如果我这样实现和使用类,会不会有内存泄漏的危险?

是的。如果以后不删除[] int 数组,它将丢失。此外,在第二个(指针)实现中,您可能还会丢失 MyTestClass 实例。

获取MyTestClass和获取MyNextTestClass,哪个更好?

获取MyTestClass,因为丢失MyTestClass 实例没有危险。

现在是长篇。主要问题是我不清楚你真正想要什么。问题标题表明您想要干净地管理(即保留/释放)您的数据。但是,在描述中,您声明数据是由您的班级用户手动管理的,您希望这样。然后,在您的代码示例中,您尝试混合使用两者(数组更新由 ObjectRetriever 自动完成,数组删除由用户决定)。所以,这里是我的建议:

a) 如果您希望内存管理由用户决定,则不需要 Objective-C Wrapper 类。当您使用 Objective-C++ 时,您可以使用与 C++ 中完全相同的 MyTestClass,就像在您的第二个代码块中一样。

b) 如果您想要安全的内存管理,并且您不能或不想更改 MyTestClass,我建议将 int 数组的创建和删除包装在 ObjC 对象的 init 和 dealloc 中。这应该在有或没有 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 重写为不需要外部内存管理。

于 2013-10-30T10:57:06.587 回答