У меня проблема с возвратом этого константного указателя. Использование отладчика показало мне, что сцена правильно импортирована и сохранена в переменной сцене. После возврата сцены содержимое, на которое указывает сцена, теряется и не может быть доступно классу, вызывающему loadData ().
const aiScene* IOHandler::loadData(const std::string& pFile){
Assimp::Importer importer;
const aiScene* scene = importer.ReadFile(pFile,
aiProcess_CalcTangentSpace |
aiProcess_Triangulate |
aiProcess_JoinIdenticalVertices |
aiProcess_SortByPType);
return scene;
}
(Importer
а также aiScene(struct)
являются частью библиотеки assimp и не могут быть изменены)
Я предполагаю, что сцена хранится в стеке, обратный вызов сбрасывает указатель стека и содержимое теряется. Как справиться с такой проблемой в C ++?
Вы забыли прочитать документация.
Сцена принадлежит Importer
поэтому он будет уничтожен, когда это выйдет за рамки. Вернуть importer.GetOrphanedScene()
взять на себя ответственность, и не забудьте удалить его, когда вы закончили с ним.
Кроме того, вы можете хранить импортер где-то более постоянным; но это может не сработать, если вам нужно импортировать и использовать много сцен одновременно.
Мое предположение Assimp::Importer
владеет ресурсом, возвращаемым ReadFile
, так когда importer
выходит из области видимости, ресурс (память) освобождается, и в итоге вы возвращаете висячий указатель. Вы можете передать его по параметру или сделать static
так что он сохраняется за пределами области действия функции или выделить scene
динамически копируя содержимое чего ReadFile
возвращается —
const aiScene* scene = new aiScene(*importer.ReadFile(pFile,
aiProcess_CalcTangentSpace |
aiProcess_Triangulate |
aiProcess_JoinIdenticalVertices |
aiProcess_SortByPType));
Вы неверно истолковали проблему. Проблема не в том, что указатель является локальным & разрушается. Проблема в том, что Assimp::Importer
Деструктор уничтожает то, на что указывает указатель. Так как Assimp::Importer
объект уничтожается в конце функции, указатель теперь указывает на недопустимый материал.
Зачем тебе loadData
функционировать? Почему бы не использовать ReadFile
как предложено здесь — http://assimp.sourceforge.net/lib_html/usage.html
В качестве альтернативы, решение вашей проблемы будет гарантировать, что Importer
объект не выходит из области видимости, пока вы не закончите, используя aiScene
,
Одним из возможных способов может быть это — сделать Importer
возложить параметр на loadData
метод.
const aiScene* IOHandler::loadData(Assimp::Importer & importer,
const std::string& pFile)
{
const aiScene* scene = importer.ReadFile(pFile,
aiProcess_CalcTangentSpace |
aiProcess_Triangulate |
aiProcess_JoinIdenticalVertices |
aiProcess_SortByPType);
return scene;
}
Код вызова будет выглядеть следующим образом.
{
........
Assimp::Importer imp;
const aiScene * p = loadData(imp, pFile);
// use aiScene
........
// Importer object goes out of scope here.
}