Как я мог управлять памятью в объективном C ++

0

Я не знаком с объективным 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, какой из них лучше?
  • Если я реализую и использую класс таким образом, у меня будет опасность утечки памяти?

Благодарю.

  • 1
    «Оператор, который использует класс»?!? Вы имеете в виду «конструктор»?
  • 0
    Вы рассматривали возможность использования C ++ 11 ?
Показать ещё 5 комментариев
Теги:
objective-c++

1 ответ

0

Во-первых, короткие ответы на ваши конкретные вопросы

Если я реализую и использую класс таким образом, у меня будет опасность утечки памяти?

Да. Если вы не удалите [] массив int в будущем, он будет потерян. Кроме того, во второй (указатель) реализации вы можете дополнительно потерять экземпляр MyTestClass.

ObtainMyTestClass и ObtainMyNextTestClass, какой из них лучше?

ObtainMyTestClass, потому что нет никакой опасности потерять экземпляр MyTestClass.

Теперь длинная часть. Главная проблема в том, что мне непонятно, чего вы действительно хотите. Заголовок вопроса предполагает, что вы хотите четко управлять (т.е. сохранять/освобождать) свои данные. Однако в описании вы указываете, что данные управляются вручную пользователем вашего класса, и вы хотите его таким образом. Затем в примерах кода вы пытаетесь сделать смесь обоих (инициализация массива выполняется автоматически ObjectRetriever, удаление массива зависит от пользователя). Итак, вот мои предложения:

a) Если вы хотите, чтобы управление памятью было до пользователя, вам не нужен класс Objective-C Wrapper. Когда вы используете Objective- C++, вы можете использовать MyTestClass точно так же, как в C++, например, в вашем втором блоке кода.

b) Если вы хотите безопасное управление памятью, и вы не можете или не хотите изменять MyTestClass, я предлагаю обернуть создание и удаление массива int в init и dealloc объекта ObjC. Это должно работать с 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, чтобы не требовать управления внешней памятью.

  • 0
    Спасибо, и теперь это очень ясно для меня. Исходя из вашего c) предложения, я решил позволить MyTestClass самостоятельно управлять памятью. Если я сделаю это, не могли бы вы ответить на мои два вопроса?
  • 0
    С вашей модификацией вопрос сводится к тому, использовать ли объекты в стеке или в куче. Что ж, это зависит от семантики MyTestClass и намерения вашей программы (например: копирует ли конструктор MyTestClass данные или копирует указатель на данные?). В среде без управления памятью, такой как c ++, я предпочитаю объекты стека, так как вы никогда не забудете удаление. Поскольку вы используете cxx11, вы можете посмотреть также на std :: shared_pointer. Помните, что в любом случае вам может потребоваться тщательная реализация конструктора копирования, деструктора и оператора присваивания.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню