
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.239.6.58] |
![]() |
|
Сообщ.
#1
,
|
|
|
Как написать проверку для объекта, который еще не был создан посредством new? Нужно различить, выполнялось ли New для данного объекта или нет.
Try не помогает. Сравнение с NULL тоже. |
Сообщ.
#2
,
|
|
|
Что значит объекта? Скорее всего там указатель на объект. Очевидно, непроинициализированный. Нужно сначала присвоить ему null, а потом сравнивать.
|
Сообщ.
#3
,
|
|
|
Я, честно говоря, не уверен что правильно тебя понял. Но обычно делают так
![]() ![]() MyClass* object = nullptr; // или NULL если nullptr еще нет ... if (!object) { // еще не создавался object = new MyClass; } |
Сообщ.
#4
,
|
|
|
Цитата Сергей85 @ Как написать проверку для объекта, который еще не был создан посредством new? В общем случае - никак. Синтаксис С++ не позволяет этого сделать. Даже если мы переопределим глобальные операторы new/delete, мы не сможем передать аллокатору адрес переменной, для которой выделяется память и конструируется экземпляр. Попутно возникает вопрос "а нужно ли?". Переменная - не константа, она может менять свое значение, в том числе и на невалидное. Тогда какой смысл проверки "выделялось/не выделялось?" Можно пойти другим путем. Переписать глобальные new/delete таким образом, когда каждое выделение памяти заносится в какой нить контейнер в виде стартового адреса и длины. Естественно, при delete - убирается. Тогда можно ответить на вопрос "переменная содержит валидный адрес-указатель?". Но для продакшен кода я этим бы и не заморачивался - слишком большой будет оверхед. Для отладки же - инструменты есть в достатке. Тот же valgrind. |
Сообщ.
#5
,
|
|
|
Я правильно понял - тебе куда-то передаётся указатель и ты хочешь знать нужно потом вызывать для него delete или нет?
Возможно, есть какой-то способ определить находится адрес в куче или нет, но стопудово не универсальный. Кроме того, не забывай, что иногда нужно вызывать delete[]. Тут ты уж точно ничего не сделаешь. Здесь лучше передавать не указатель, а unique_ptr, у которого можно переопределять функцию удаления объекта. Для динамических объектов будет передаваться unique_ptr<T, std::default_delete>, для статических - unique_ptr<T, do_nothing> и т.п. |
Сообщ.
#6
,
|
|
|
Да, решением оказалось, как и в случае с обычными переменными - убрать мусор из указателя, присвоив ему NULL. И сравнение пошло успешно. Главное, в будущем не забывать после delete делать null.
|
Сообщ.
#7
,
|
|
|
Только делайте это аккуратно, не вводите себе аки аксиому, а то получите хлам наподобие:
![]() ![]() { int **a; ... for( int i=0; i<n; i++) a[i] = NULL; delete [] *a; a = NULL; return 0; } |
Сообщ.
#8
,
|
|
|
Сергей85, std::vector или std::shared(unique)_ptrскорее всего решили бы твои проблемы.
|