Я новичок в 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
*myPtrA = *tmpA;
Это хороший способ инициализировать мой константный указатель myPtrA?
Нет, вы не инициализированы myPtrA
совсем. Он был инициализирован по умолчанию и поэтому имеет неопределенное значение. Разыменование указателя с неопределенным значением (*myPtrA
) имеет неопределенное поведение.
могу ли я удалить свой указатель tmpA сразу после строки * myPtrA = * a; без риска потери содержимого, указанного myPtrA?
Да, это безопасно. Объект, указанный myPtrA
является копией (по назначению) той, на которую указывает tmpA
, Тем не менее, совершенно бессмысленно выделять динамический объект, копировать его и, в первую очередь, уничтожать, когда вы можете просто создать / изменить копию напрямую.
Вот пример того, как правильно инициализировать указатель на член:
class myClass{
protected:
A *const myPtrA = new A;
};
PS. Хотя полезно узнать, как это сделать, вряд ли вам когда-либо придется управлять памятью вручную в реальных программах. Вместо этого используйте контейнеры RAII, такие как std::unique_ptr
,
Других решений пока нет …