Деструктор для указателя на массив фиксированного размера - PullRequest
1 голос
/ 30 сентября 2011

Предположим, у меня есть класс C ++ с двумя закрытыми переменными.Массив фиксированного размера data и указатель на этот массив pnt.

class MyClass
{
   private:
      double *pnt;
      double data[2];
   public:
      myClass();
      virtual ~MyClass();
      double* getPnt() const;
      void setPnt(double* input);
};

MyClass::MyClass()
{

   double * input;
   data[0] = 1;
   data[1] = 2;

   input= data;
   setPnt(input);
}

MyClass::~MyClass()
{
 delete this->pnt; // This throws a runtime error
}


void MyClass::setPnt(double * input)
{
   pnt = input;
}

double * MyClass::getPnt() const;
{
   return pnt;
}

int main()
{
   MyClass spam; // Construct object
   delete spam; // Error C2440: 'delete' cannot convert from 'MyClass' to 'void*'
}

С этим кодом связаны две проблемы.Во-первых, если я пытаюсь вызвать delete для объекта, я получаю:

Ошибка C2440: «delete» не может преобразовать из «MyClass» в «void *»

Во-вторых, если я закомментирую оператор удаления, я получу ошибку в реальном времени о том, что утверждение отладки не удалось!и это:

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

Мой вопрос: Для класса с указателем на частный массив фиксированного размера, как правильно освободить память, написать / вызвать деструктор?

PS Я не могу использовать vector или подобные контейнеры (отсюда и этот вопрос).

Ответы [ 2 ]

5 голосов
/ 30 сентября 2011

Не вижу статического массива.Я вижу массив фиксированного размера.Также память для data выделяется как часть объекта.

Вы не должны явно удалять члена класса: оператор удаления позаботится о том, чтобы IFF экземпляр был динамическивыделено.

 {
      MyClass x; // auto variable
 } // x destructor run, no delete operator

против

 {
      MyClass* x = new MyClass(); // heap allocation variable
      delete x; // x destructor run, ::delete de-allocates from heap
 } 
2 голосов
/ 30 сентября 2011

data является подобъектом, он будет освобожден, когда экземпляр MyClass исчезнет.Компилятор вставит любой необходимый код в деструктор MyClass для вызова деструкторов для всех подобъектов до освобождения памяти.

...