Merge pull request #1672 from turol/memfixes

Memory management fixes
pull/1671/head^2
Kim Kulling 2018-01-02 21:56:07 +01:00 committed by GitHub
commit d2a6bb15c2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 18 additions and 17 deletions

View File

@ -168,7 +168,7 @@ void MMDImporter::CreateDataFromImport(const pmx::PmxModel *pModel,
} }
// create node hierarchy for bone position // create node hierarchy for bone position
aiNode **ppNode = new aiNode *[pModel->bone_count]; std::unique_ptr<aiNode *[]> ppNode(new aiNode *[pModel->bone_count]);
for (auto i = 0; i < pModel->bone_count; i++) { for (auto i = 0; i < pModel->bone_count; i++) {
ppNode[i] = new aiNode(pModel->bones[i].bone_name); ppNode[i] = new aiNode(pModel->bones[i].bone_name);
} }
@ -177,9 +177,9 @@ void MMDImporter::CreateDataFromImport(const pmx::PmxModel *pModel,
const pmx::PmxBone &bone = pModel->bones[i]; const pmx::PmxBone &bone = pModel->bones[i];
if (bone.parent_index < 0) { if (bone.parent_index < 0) {
pScene->mRootNode->addChildren(1, ppNode + i); pScene->mRootNode->addChildren(1, ppNode.get() + i);
} else { } else {
ppNode[bone.parent_index]->addChildren(1, ppNode + i); ppNode[bone.parent_index]->addChildren(1, ppNode.get() + i);
aiVector3D v3 = aiVector3D( aiVector3D v3 = aiVector3D(
bone.position[0] - pModel->bones[bone.parent_index].position[0], bone.position[0] - pModel->bones[bone.parent_index].position[0],
@ -324,8 +324,10 @@ aiMesh *MMDImporter::CreateMesh(const pmx::PmxModel *pModel,
auto it = bone_vertex_map.find(ii); auto it = bone_vertex_map.find(ii);
if (it != bone_vertex_map.end()) { if (it != bone_vertex_map.end()) {
pBone->mNumWeights = static_cast<unsigned int>(it->second.size()); pBone->mNumWeights = static_cast<unsigned int>(it->second.size());
pBone->mWeights = it->second.data(); pBone->mWeights = new aiVertexWeight[pBone->mNumWeights];
it->second.swap(*(new vector<aiVertexWeight>)); for (unsigned int j = 0; j < pBone->mNumWeights; j++) {
pBone->mWeights[j] = it->second[j];
}
} }
bone_ptr_ptr[ii] = pBone; bone_ptr_ptr[ii] = pBone;
} }

View File

@ -649,7 +649,7 @@ namespace glTF
int width, height; int width, height;
private: private:
uint8_t* mData; std::unique_ptr<uint8_t[]> mData;
size_t mDataLength; size_t mDataLength;
public: public:
@ -664,7 +664,7 @@ namespace glTF
{ return mDataLength; } { return mDataLength; }
inline const uint8_t* GetData() const inline const uint8_t* GetData() const
{ return mData; } { return mData.get(); }
inline uint8_t* StealData(); inline uint8_t* StealData();

View File

@ -297,7 +297,7 @@ inline void Buffer::Read(Value& obj, Asset& r)
if (dataURI.base64) { if (dataURI.base64) {
uint8_t* data = 0; uint8_t* data = 0;
this->byteLength = Util::DecodeBase64(dataURI.data, dataURI.dataLength, data); this->byteLength = Util::DecodeBase64(dataURI.data, dataURI.dataLength, data);
this->mData.reset(data); this->mData.reset(data, std::default_delete<uint8_t[]>());
if (statedLength > 0 && this->byteLength != statedLength) { if (statedLength > 0 && this->byteLength != statedLength) {
throw DeadlyImportError("GLTF: buffer \"" + id + "\", expected " + to_string(statedLength) + throw DeadlyImportError("GLTF: buffer \"" + id + "\", expected " + to_string(statedLength) +
@ -601,7 +601,6 @@ T Accessor::Indexer::GetValue(int i)
inline Image::Image() inline Image::Image()
: width(0) : width(0)
, height(0) , height(0)
, mData(0)
, mDataLength(0) , mDataLength(0)
{ {
@ -624,8 +623,8 @@ inline void Image::Read(Value& obj, Asset& r)
Ref<BufferView> bv = r.bufferViews.Get(bufferViewId); Ref<BufferView> bv = r.bufferViews.Get(bufferViewId);
if (bv) { if (bv) {
mDataLength = bv->byteLength; mDataLength = bv->byteLength;
mData = new uint8_t[mDataLength]; mData.reset(new uint8_t[mDataLength]);
memcpy(mData, bv->buffer->GetPointer() + bv->byteOffset, mDataLength); memcpy(mData.get(), bv->buffer->GetPointer() + bv->byteOffset, mDataLength);
} }
} }
} }
@ -640,7 +639,9 @@ inline void Image::Read(Value& obj, Asset& r)
if (ParseDataURI(uristr, uri->GetStringLength(), dataURI)) { if (ParseDataURI(uristr, uri->GetStringLength(), dataURI)) {
mimeType = dataURI.mediaType; mimeType = dataURI.mediaType;
if (dataURI.base64) { if (dataURI.base64) {
mDataLength = Util::DecodeBase64(dataURI.data, dataURI.dataLength, mData); uint8_t *ptr = nullptr;
mDataLength = Util::DecodeBase64(dataURI.data, dataURI.dataLength, ptr);
mData.reset(ptr);
} }
} }
else { else {
@ -652,10 +653,8 @@ inline void Image::Read(Value& obj, Asset& r)
inline uint8_t* Image::StealData() inline uint8_t* Image::StealData()
{ {
uint8_t* data = mData;
mDataLength = 0; mDataLength = 0;
mData = 0; return mData.release();
return data;
} }
inline void Image::SetData(uint8_t* data, size_t length, Asset& r) inline void Image::SetData(uint8_t* data, size_t length, Asset& r)
@ -670,7 +669,7 @@ inline void Image::SetData(uint8_t* data, size_t length, Asset& r)
bufferView->byteOffset = b->AppendData(data, length); bufferView->byteOffset = b->AppendData(data, length);
} }
else { // text file: will be stored as a data uri else { // text file: will be stored as a data uri
this->mData = data; this->mData.reset(data);
this->mDataLength = length; this->mDataLength = length;
} }
} }

View File

@ -616,7 +616,7 @@ void glTFImporter::ImportEmbeddedTextures(glTF::Asset& r)
// Add the embedded textures // Add the embedded textures
for (size_t i = 0; i < r.images.Size(); ++i) { for (size_t i = 0; i < r.images.Size(); ++i) {
Image img = r.images[i]; Image &img = r.images[i];
if (!img.HasData()) continue; if (!img.HasData()) continue;
int idx = mScene->mNumTextures++; int idx = mScene->mNumTextures++;