Вопрос такой, зачем и что значит указатель типа собственный объект/класс?
class A{
};
A* ptrA;
И что я могу делать с этим указателем? Не судите строго я новичок))
В вашем примере сделать практически ничего нельзя, так как класс пустой. Можно только его инициализировать, но толку от этого нет. Для примера создадим в классе один публичный метод и одно публичное поле.
class A{
public:
int i;
int f(){
return i;
}
};
Пусть у нас есть указатель на тип A:
A *ptrA;
Пока он не инициализирован, поэтому обращаться к нему нельзя. Но его можно инициализировать. Например, с помощью вновь созданного оператором new объекта:
ptrA = new A;
Теперь ptrA содержит валидный объект класса A, и можно обращаться ко всем его открытым членам:
int i1 = ptrA->i;
int i2 = ptrA->f();
Если объект больше не нужен, его можно удалить:
delete ptrA;
Оператор delete вызывает деструктор класса и освобождает занятую им память. После этого указатель становится недействительным. К членам класса A по указателю ptrA обращаться больше нельзя.
Инициализировать этот указатель можно и иначе. Допустим, у нас уже есть где-то созданный объект класса A. Тогда можно инициализировать этот указатель адресом этого объекта:
A a;
A *ptrA = &a;
Здесь ptrA указывает на объект a. К его членам можно обращаться как с помощью переменной a и оператора "точка", так и с помощью переменной ptrA и оператора "стрелка".
delete указатель сохранит своё значение. Стандарт запрещает его разыменовывать и только.
– Stanislav Volodarskiy
Dec 27 '22 at 13:00
После delete указатель сохранит своё значение. — так тоже говорить нельзя. :) После высвобождения памяти все указатели на любой байт освобождённой памяти изменяют своё значение на invalid pointer value (basic.stc.general/4). Разыменование и повторная деаллокация невалидного указателя вызывают UB. А вот прочие действия над ним являются implementation-defined behavior. Особенно веселит, что по мнению стандарта простое копирование невалидного указателя может порушить программу:
– wololo
Dec 28 '22 at 21:47
Some implementations might define that copying an invalid pointer value causes a system-generated runtime fault. Если по старому адресу снова будет выделена память и там будет жить объект, старый указатель не станет вновь валидным. Т.е. два побайтово равных указателя запросто могут хранить разные значения. На практике с современными оптимизирующими компиляторами это может приводить к тяжелейшим последствиям. Ну а vc++ и вовсе умеет явно портить указатель после delete.
– wololo
Dec 28 '22 at 21:48
new, и затем обращаться ко всем его открытым членам. – maestro Dec 27 '22 at 10:14