Инициализация константного указателя на структуру переполнения стека

Я новичок в C ++ и запутался в инициализации константных указателей, объявленных в заголовках. Чтобы привести только один пример, у меня в заголовке есть структура и класс вроде:

/* header file.h */
typedef struct A{ ... } A;

class myClass{
protected:
A *const myPtrA;
}

И хотел бы создать экземпляр содержимого myPtrA, например, в конструкторе, зная, что A является довольно сложной структурой, состоящей из подструктур, и ее необходимо динамически создавать:

/* source file.cpp */
#include file.h

myClass::myClass() {
A *tmpA = new A;
*myPtrA = *tmpA;
}

Это хороший способ инициализировать мой константный указатель myPtrA? И если каждому новому вызову требуется выделенный вызов удаления, могу ли я удалить свой указатель tmpA сразу после строки * myPtrA = * a; без риска потери содержимого, указанного myPtrA?

Заранее спасибо за ваше время (и простите мой английский;))

qroh

0

Решение

*myPtrA = *tmpA;

Это хороший способ инициализировать мой константный указатель myPtrA?

Нет, вы не инициализированы myPtrA совсем. Он был инициализирован по умолчанию и поэтому имеет неопределенное значение. Разыменование указателя с неопределенным значением (*myPtrA) имеет неопределенное поведение.

могу ли я удалить свой указатель tmpA сразу после строки * myPtrA = * a; без риска потери содержимого, указанного myPtrA?

Да, это безопасно. Объект, указанный myPtrA является копией (по назначению) той, на которую указывает tmpA, Тем не менее, совершенно бессмысленно выделять динамический объект, копировать его и, в первую очередь, уничтожать, когда вы можете просто создать / изменить копию напрямую.

Вот пример того, как правильно инициализировать указатель на член:

class myClass{
protected:
A *const myPtrA = new A;
};

PS. Хотя полезно узнать, как это сделать, вряд ли вам когда-либо придется управлять памятью вручную в реальных программах. Вместо этого используйте контейнеры RAII, такие как std::unique_ptr,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]