Указатель на неверный контент после возврата функции

У меня проблема с возвратом этого константного указателя. Использование отладчика показало мне, что сцена правильно импортирована и сохранена в переменной сцене. После возврата сцены содержимое, на которое указывает сцена, теряется и не может быть доступно классу, вызывающему 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 ++?

1

Решение

Вы забыли прочитать документация.

Сцена принадлежит Importerпоэтому он будет уничтожен, когда это выйдет за рамки. Вернуть importer.GetOrphanedScene() взять на себя ответственность, и не забудьте удалить его, когда вы закончили с ним.

Кроме того, вы можете хранить импортер где-то более постоянным; но это может не сработать, если вам нужно импортировать и использовать много сцен одновременно.

4

Другие решения

Мое предположение Assimp::Importer владеет ресурсом, возвращаемым ReadFile, так когда importer выходит из области видимости, ресурс (память) освобождается, и в итоге вы возвращаете висячий указатель. Вы можете передать его по параметру или сделать static так что он сохраняется за пределами области действия функции или выделить scene динамически копируя содержимое чего ReadFile возвращается —

const aiScene* scene = new aiScene(*importer.ReadFile(pFile,
aiProcess_CalcTangentSpace      |
aiProcess_Triangulate           |
aiProcess_JoinIdenticalVertices |
aiProcess_SortByPType));
0

Вы неверно истолковали проблему. Проблема не в том, что указатель является локальным & разрушается. Проблема в том, что 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.
}
0