Приложение вылетает на Apple LLVM 3.0, но работает нормально на LLVM GCC 4.2 - PullRequest
3 голосов
/ 01 ноября 2011

У меня очень странный сбой при использовании компилятора Apple LLVM 3.0. Итак, есть некоторый код, который использует Assimp для загрузки ресурсов и создания сцены (я исключил весь свой код, и даже тогда он вылетает):

aiScene* ai_scene = const_cast<aiScene*>(aiImportFileFromMemory(fileBuf, fInfo.uncompressed_size, aiProcessPreset_TargetRealtime_MaxQuality, NULL));

delete ai_scene;

Вот скриншот трассировки стека для GCC:

enter image description here

А вот для LLVM:

enter image description here

В версии LLVM деструктор вызывается дважды (и, вероятно, именно поэтому у меня происходит сбой).

Следует также упомянуть, что весь код деструктора находится в заголовочном файле и вылетает только на устройстве (протестировано на iPod 4 и iPad 2).

Это ошибка в компиляторе LLVM (возможно, при генерации сборки рукава) или я что-то упустил?

Редактировать:

, если у кого-то есть подобная проблема, используйте aiReleaseImport(scene) вместо delete scene;

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Вы не должны delete этот указатель вообще. Прочитайте документацию. В нем четко сказано, что вы не должны пытаться освободить его каким-либо образом.

Если вызов успешен, содержимое файла возвращается как указатель на объект aiScene. Возвращенные данные предназначены для только для чтения, импортер сохраняет право собственности на данные и уничтожает это при разрушении. В случае сбоя импорта возвращается NULL. удобочитаемое описание ошибки можно получить, вызвав aiGetErrorString ().

И, кроме того, в документации прямо указано, что она доступна только для чтения, поэтому не const_cast const.

0 голосов
/ 01 ноября 2011

У меня раньше была похожая проблема, и она была довольно редкой, потому что я не отвечаю (кроме моей) на эту проблему Сборка AppStore вылетает при запуске на iPhone 3g и iPod Touch

Сбой возможен только на iPhone 3g и на старом iPod touch.

...