serpanok
@serpanok

Как проверить существует ли указатель или был удален?

Есть условный класс
class  A{
public:
	int data;
	A(int d){
		data = d;
	};
	~A(){
		// тут качественная чистка
	};
};

int main(){
	A* pa = new A(10);
	if (pa){
		cout << pa->data;
	}
	delete pa;
	if (pa){
		cout << pa->data;
	}

	system("Pause");
	return 0;
}


Как проверить существует ли указатель или был удален?
Было бы шикарно если бы это делалось перегрузкой какого то оператора и созданием у класса флага(удобно будет исходя из моей задачи).

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

У меня стоит задача реализовать smart_ptr самому(задание в универе).
Задание
С++: Smart_ptr. Реализуйте класс предоставляющий пользователю семантику указателя с подсчетом количества ссылок на указываемый элемент. Когда количество ссылок становится равным нулю, указываемый элемент должен быть уничтожен автоматически. Предусмотрите внешнее хранение данных для количества ссылок на элемент. Необходимо чтобы ваш указатель можно было использовать в выражениях вида if (p) {}.
  • Вопрос задан
  • 1178 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
В Си++11 для этого есть два класса: std::shared_ptr и std::weak_ptr.

Первый служит для того, чтобы несколько указателей «смотрели» на один объект, и при исчезновении ВСЕХ объект автоматически исчезал.

Второй «смотрит» на тот же объект, что управляется shared_ptr’ами, но не мешает объекту удаляться. Его можно преобразовать в shared_ptr и тогда уж посмотреть, исчез объект или нет.

UPD. Вы делаете свой shared_ptr. Тогда, если shared_ptr не NULL — значит, считаем, что объект действительно там есть! А если кто-то удалил своими силами — значит либо shared_ptr глючный, либо кто-то удалил объект в объод семантики умных указателей.

Кроме того, код по ссылке странный. if (ref_count == 0) — это мы сравниваем указатель с NULL! Написано «переписываем оператор равенства» — по факту переписываем операцию присваивания…
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Использовать shared_ptr/unique_ptr вместо сырых указателей.
Ответ написан
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
Указатель всегда существует, если ты можешь к нему обратиться, ведь это обычная переменная.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы