Я адаптировал Matt Gallagher "Тестирование, если произвольный указатель является допустимым указателем объекта" в проекте iOS, который использует Objective- C++. Он отлично работает с объектами Objective-C, но он всегда говорит мне, что мои C++ -инверторы недействительны независимо от того, работает ли это или нет. Иногда код падает с указателем. Иногда код работает нормально. Но тестовый метод всегда говорит мне, что указатель ошибочен.
Это кто-нибудь, кто знает, чтобы адаптировать этот код к классам и объектам C++? Я мог представить, что код работает только с Objective-C в соответствии с использованием "Class"
Содержимое переменной указателя является либо: нулевым указателем, действительным указателем на объект, действительным указателем на элемент массива, либо последним элементом массива, либо некорректным указателем.
Если это недопустимый указатель, то любая попытка его использования вызывает неопределенное поведение. Это включает любую попытку проверить, что это недопустимый указатель. И там вы застряли. Все, что вы можете сделать, это проверить, является ли он нулевым указателем, или же он равен некоторому другому действительному указателю.
Вы должны пойти с философией Objective-C: Попытка использовать недопустимый указатель - это ошибка программирования. Вы не пытаетесь обнаружить и обработать это во время выполнения. Вы позволяете ему сбой и исправлять ошибку в коде.
Указатели C++ просто ссылаются на адрес в памяти. Вы можете посмотреть, что там в памяти, используя средство просмотра памяти, но это даже не гарантировало бы сохранение памяти. Например:
char* test = new[13];
strcpy(test, "Hello World!");
delete[] test;
.
.
.
printf("%s", test);
В некоторых случаях это будет успешно завершено. Иногда он печатает строку мусора. И иногда это будет segfault. Там нет ничего, чтобы говорить с действительностью указателя.
Если вы смотрите на программу, которая только что прервана, и вы пытаетесь увидеть, что произошло, есть несколько вариантов, доступных вам:
0xbadfood5
память перед запуском, чтобы сделать это более понятным, используя 0xbadfood5
или что-то подобное.Лучшим вариантом является проверка ошибок в вашем коде. Похоже, у вас этого нет, иначе вас здесь не будет. Предпосылки и постусловия велики и сэкономят вам массу времени в долгосрочной перспективе (например, сейчас). Однако в качестве серебряной подкладки вы должны использовать это, чтобы точнее получить лучшие стандарты кодирования в вашей организации в будущем.
nullptr
когда вы проверили правильность указателя? Если вы хотите проверить правильность данных, вам нужно разыменовать указатель, и это приведет к exc_bad_access (segfault), если сам указатель недопустим. На данный момент, я не думаю, что есть какой-либо способ на самом деле проверить данные.