удаление указателя на класс, который создает массив - PullRequest
3 голосов
/ 04 марта 2011

В основном у меня есть класс А., который создает массив при создании.

class A
{
public:
A (float height, float width, BYTE* data)
{
    setsize(height,width);
    mydata = CreateNewBuffer(sizes);
    setdata(data);     
}


~A() 
{

}
void setsize(float height, float width)
{
    sizes.cx = width;
    sizes.cy = height;
}

BYTE* CreateNewBuffer (SIZE  sImage)
{
    return new BYTE [sImage.cx * sImage.cy];
}

void setdata(BYTE* data)
{
    memcpy(threatdata,data,sImage.cx * sImage.cy);
}

}

Я создаю указатель на этот класс в большем классе:

A* mypointer;

, который я инициализирую в3-й класс после прохождения через функцию:

3rdClass::instance()->myfunction(mypointer)

и внутри функции myfunction () я установил bool, указывающий, что класс был построен

mypointer = new A(height,width,data);
wasconstructed = true;

Теперь в следующий раз, когда я приду кПередав указатель на функцию myfunction(), я проверяю, был ли класс уже создан, если это так, я хочу удалить его, чтобы он создал новый без потери памяти.

Что является правильнымспособ сделать это:

Я пробовал базовые вещи, как,

if (3rdClass::instance()->checkifconstructed()){
    delete mypointer; //(or even delete [] mypointer but then i get heap corruption)
    mypointer = NULL;
}

Но это не похоже на работу.

Ответы [ 2 ]

4 голосов
/ 04 марта 2011

Я предполагаю, что mydata является членом вашего класса (в противном случае, что такое mydata в 7-й строке вашего кода?)

Итак, динамический массив является членом вашегоучебный класс.Если вы хотите уничтожить его, когда уничтожается содержащий объект, вы должны сделать именно это: упорядочить уничтожение вашего члена в деструкторе вашего класса.Что-то вроде:

~A() 
{
  delete [] mydata;
}

Теперь, когда вы вызываете delete mypointer, он вызовет деструктор класса, который уничтожит массив.

1 голос
/ 04 марта 2011

Если в конструкторе new [] какие-то данные, деструктор должен удалить [] его снова.

Вам также следует учитывать, что произойдет, если вы копируете или присваиваете объекту класса. Вам нужно создать новый набор данных и скопировать значения из исходного объекта?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...