繁体   English   中英

如何正确存储多个实例对象?

[英]How would I store multiple instance objects correctly?

我正在制作一个中级/高级C ++程序,准确的视频游戏。

最近我注意到有大量的内存被泄露,我想知道我创建实例的方式是否有问题。

下面是一个总结(但最初是复杂的)类:

class theObject
{
 //Instance variables
 //Instance functions
};

与此对象(与我存储任何其他的目的,我的每一个不同的变异模板的数组索引theObject这部分不是很重要,但是我将它们存储(或者在我看来的方式)是:

//NEWER VERSION WITH MORE INFO
void spawnTheObject()
{
 theObject* NewObj=ObjectArray[N];
 //I give the specific copy its individual parameters(such as its spawn location and few edited stats)
 NewObj->giveCustomStats(int,int,int,int);//hard-coded, not actual params
 NewObj->Spawn(float,float,float);
 myStorage.push_back(new theObject(*NewObj));
}


//OLDER VERSION
void spawnTheObject()
    {
     //create a copy of the arrayed object
     theObject* NewObj=new theObject(*ObjectArray[N]);
     //spawn the object(in this case it could be a monster), and I am spawning multiple copies of them obviously
     //then store into the storage object(currently a deque(originally a vector))
     myStorage.push_back(new theObject(*NewObj));
     //and delete the temporary one
     delete NewObj;
    }

我目前正在使用deque(最近使用向量更改)但我发现内存使用没有区别。 我从“评论测试”中发现,我所拥有的这些产卵函数是内存泄漏的原因。 由于这是创建/生成实例的错误方法,我想知道是否有更好的方法来存储这些对象。

tl; dr:有哪些更好的对象来存储非恒定数量的对象以及如何?

我猜你永远不会在myStorage中清除新的spawn对象导致内存增加(因为你引用内存泄漏)。 如果我是正确的,你的myStorage声明如下:

std::deque<theObject*> myStorage;

如果您调用以下任一调用,则指向该对象的指针将被删除,但不会删除实际动态分配的对象。

 myStorage.pop_back();
 myStorage.clear();

您的代码中的另一个小问题是,您在spawnTheObject()函数中进行不必要的对象分配/解除spawnTheObject()

如何用指针类型清理容器

您需要遍历myStorage中的每个元素,删除该对象然后清除容器,例如:

for (std::deque<theObject*>::iterator iter=myStorage.begin();
     iter != myStorage.end(); ++iter)
{
   delete (*iter);
}
myStorage.clear();

更好的方案:

std::dequestd::vector使用智能指针,然后当从STL容器中删除元素时,指针指向的对象也会自动删除。

 #include <memory>

 std::deque<std::shared_ptr<theObject> > myStorage;
 myStorage.push_back(std::shared_ptr<theObject>(new *ObjectArray[N]));

 mySorage.clear();  // all memories cleared properly, no worries

如果你没有在游戏结束时从myStorage手动删除你的对象,或者当它们需要被销毁时,你的内存就会泄漏。

myStorage.push_back(new theObject(*NewObj));

被推入存储的对象由您分配,因此当它需要消失时,它应该被您销毁。

另外我不了解中间NewObj对象的需要,它不是内存泄漏,但它是一个不必要的性能成本,1分配/释放+ 1副本。

正如Forever所提到的,最好的办法是开始使用智能指针, std::unique_ptrstd::shared_ptr (仅限c ++ 11)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM