我正在制作一个中级/高级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:有哪些更好的对象来存储非常量的对象以及如何?
答案 0 :(得分:2)
我猜你永远不会在myStorage
中清除导致内存增加的新spawn对象(因为你引用内存泄漏)。如果我是正确的,你的myStorage声明如下:
std::deque<theObject*> myStorage;
如果您调用以下任一调用,则指向该对象的指针将被删除,但不会删除实际动态分配的对象。
myStorage.pop_back();
myStorage.clear();
您的代码中的另一个小问题是,您在spawnTheObject()
函数中进行了不必要的对象分配/解除定位。
如何使用指针类型清理容器
您需要遍历myStorage中的每个元素,删除对象然后清除容器,例如:
for (std::deque<theObject*>::iterator iter=myStorage.begin();
iter != myStorage.end(); ++iter)
{
delete (*iter);
}
myStorage.clear();
更好的解决方案:
在std::deque
或std::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
答案 1 :(得分:0)
如果您未在游戏结束时从myStorage
手动删除对象或需要销毁它们,则会出现内存泄漏。
myStorage.push_back(new theObject(*NewObj));
被推入存储的对象是由你分配的,所以当它需要消失时它应该被你销毁。
此外,我不了解中间NewObj
对象的需要,它不是内存泄漏,但它是一个不必要的性能成本,1个分配/释放+ 1个副本。
正如Forever所提到的,最好的办法是开始使用智能指针,std::unique_ptr
或std::shared_ptr
(仅限c ++ 11)。