在Apple LLVM 3.0上应用程序崩溃,但在LLVM GCC 4.2上正常工作。

3

使用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编译器的错误(可能在生成ARM汇编时)还是我遗漏了什么?
编辑:
如果有人遇到类似的问题,请使用aiReleaseImport(scene)而不是delete scene;
2个回答

3
您不应该删除那个指针。请仔细阅读文档,它明确说明您不应该尝试以任何方式释放它。
如果调用成功,则文件的内容将作为aiScene对象的指针返回。返回的数据是只读的,导入器保留数据的所有权,并在销毁时销毁它。如果导入失败,则返回NULL。可以通过调用aiGetErrorString()来检索可读的错误描述。
此外,文档明确说明它是只读的,因此不要使用const_cast取消const。

至于 const_cast - 这是过时的代码,我很快就会将其删除(实际上场景被视为常量)。 - Max
谢谢你指引我正确的方向。你对于delete运算符是正确的。 - Max

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接