2014-11-25 5 views
0

Я адаптировал приложение "Testing if an arbitrary pointer is a valid object pointer" Мэтта Галлахера в проекте iOS, который использует Objective-C++. Он отлично работает с объектами Objective-C, но всегда говорит мне, что мои C++-указатели являются недопустимыми, независимо от того, работает он или нет. Иногда код падает с указателем. Иногда код работает нормально. Но тестовый метод всегда говорит мне, что указатель ошибочен.Проверка правильности указателя C++ (в Objective-C (++))

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

+0

Вы пытались использовать 'nullptr', когда вы проверяли, был ли указатель действительным? Если вы хотите проверить действительные данные, вам нужно разыменовать указатель, и это приведет к exc_bad_access (segfault), если сам указатель недействителен. На данный момент я не думаю, что есть какой-либо способ действительно проверить данные. –

+1

Этот метод очень специфичен для реализации Objective-C от Apple, и в лучшем случае является ненадежным. Нет никакого способа сделать что-либо подобное для C++ и, как отмечает автор, «никогда не использовать это в производственном коде». – molbdnilo

+0

@AlexanderW да, мы проверяли значение nullptr, null, nil, 0 ... но код иногда всегда продолжает выполнение и сбой происходит с EXC_BAD_ACCESS, который не может быть обнаружен ... => molbdnilo мы используем это только для записи журналов отладки, чтобы получить подробную информацию о рабочем процессе наших внутренних тестеров. Они часто не сообщают о сбоях правильно ... –

ответ

1

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

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

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

1

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

char* test = new[13]; 

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

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

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

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

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

Смежные вопросы