我如何在客观C++中管理记忆

How could I manage memory in objective C++

本文关键字:管理 记忆 C++ 客观      更新时间:2023-10-16

我不熟悉客观的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,哪一个更好?
  • 如果我以这种方式实现和使用类,我会有内存泄漏的危险吗?

谢谢。

首先,对您的特定问题的简短回答

如果我以这种方式实现和使用类,我会有内存泄漏的危险吗?

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

AcquiretainMyTestClass 和 AcquiretainMyNextTestClass,哪个更好?

获取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 作为不需要外部内存管理。