Проверка правильности указателя C ++ (в Objective-C (++))

0

Я адаптировал Matt Gallagher "Тестирование, если произвольный указатель является допустимым указателем объекта" в проекте iOS, который использует Objective- C++. Он отлично работает с объектами Objective-C, но он всегда говорит мне, что мои C++ -инверторы недействительны независимо от того, работает ли это или нет. Иногда код падает с указателем. Иногда код работает нормально. Но тестовый метод всегда говорит мне, что указатель ошибочен.

Это кто-нибудь, кто знает, чтобы адаптировать этот код к классам и объектам C++? Я мог представить, что код работает только с Objective-C в соответствии с использованием "Class"

  • 0
    Вы пытались использовать nullptr когда вы проверили правильность указателя? Если вы хотите проверить правильность данных, вам нужно разыменовать указатель, и это приведет к exc_bad_access (segfault), если сам указатель недопустим. На данный момент, я не думаю, что есть какой-либо способ на самом деле проверить данные.
  • 1
    Этот метод очень специфичен для реализации Apple Objective-C и ненадежен в лучшем случае. Нет никакого способа сделать что-то подобное для C ++ и, как отмечает автор, «никогда не используйте это в рабочем коде».
Показать ещё 3 комментария
Теги:
xcode
pointers

2 ответа

1
Лучший ответ

Содержимое переменной указателя является либо: нулевым указателем, действительным указателем на объект, действительным указателем на элемент массива, либо последним элементом массива, либо некорректным указателем.

Если это недопустимый указатель, то любая попытка его использования вызывает неопределенное поведение. Это включает любую попытку проверить, что это недопустимый указатель. И там вы застряли. Все, что вы можете сделать, это проверить, является ли он нулевым указателем, или же он равен некоторому другому действительному указателю.

Вы должны пойти с философией Objective-C: Попытка использовать недопустимый указатель - это ошибка программирования. Вы не пытаетесь обнаружить и обработать это во время выполнения. Вы позволяете ему сбой и исправлять ошибку в коде.

1

Указатели C++ просто ссылаются на адрес в памяти. Вы можете посмотреть, что там в памяти, используя средство просмотра памяти, но это даже не гарантировало бы сохранение памяти. Например:

char* test = new[13];

strcpy(test, "Hello World!");
delete[] test;
.
.
.
printf("%s", test);

В некоторых случаях это будет успешно завершено. Иногда он печатает строку мусора. И иногда это будет segfault. Там нет ничего, чтобы говорить с действительностью указателя.

Если вы смотрите на программу, которая только что прервана, и вы пытаетесь увидеть, что произошло, есть несколько вариантов, доступных вам:

  • Вы можете посмотреть память через программу просмотра памяти, которая в сочетании с линией, с которой вы столкнулись, может обеспечить понимание.
  • Вы можете 0xbadfood5 память перед запуском, чтобы сделать это более понятным, используя 0xbadfood5 или что-то подобное.
  • Использовать Valgrind при запуске - отличный инструмент, если вы можете справиться с накладными расходами.

Лучшим вариантом является проверка ошибок в вашем коде. Похоже, у вас этого нет, иначе вас здесь не будет. Предпосылки и постусловия велики и сэкономят вам массу времени в долгосрочной перспективе (например, сейчас). Однако в качестве серебряной подкладки вы должны использовать это, чтобы точнее получить лучшие стандарты кодирования в вашей организации в будущем.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню