gpt4 book ai didi

c++ - 指针 vector 中的内存泄漏

转载 作者:行者123 更新时间:2023-11-27 23:42:38 25 4
gpt4 key购买 nike

我正在制作一个使用大量包含指针的 vector 的程序,我担心我删除指针的方式可能会导致内存泄漏。

下面是我如何向 vector 添加项目符号的示例:

Bullet* aNewBullet;
aNewBullet = new Bullet(x,y,dirX,dirY,size,duration);
aNewBullet->assignTexture(btext);
bulletVector.push_back(aNewBullet);

下面是我如何从 vector 中删除项目符号(例如,如果它超出其范围)

int i=0;
while (i<bulletVector.size()){
if (bulletVector[i]->getDuration() ==0)
bulletVector.erase(bulletVector.begin() + i);
else i++;
}

我是否通过让 vector 删除来删除项目符号?或者我应该做什么

int i=0;
while (i<bulletVector.size()){
if (bulletVector[i]->getDuration() ==0)
delete bulletVector[i];
bulletVector.erase(bulletVector.begin() + i);
else i++;
}

相反?首先删除指针,然后再次从 vector 中删除记录,这是否会弄乱 vector 大小?

还有删除指针会调用子弹析构函数(~Bullet())吗?

最佳答案

在第一个代码示例中,您没有删除任何 Bullet目的。删除 vector只删除指针,不删除指向的对象。

您的第二个示例确实正确删除了 Bullet s(不是所有的都给定条件和循环设置),但前提是您在修改 vector 的所有点进行必要的删除并手动确保指针永远不会被删除两次(例如,因为它存在于两个 vector 中) .这不是应该使用容器的方式。

如果你真的想存储指针并让 vector 拥有它们,那么你应该使用 std::vector<std::unique_ptr<Bullet>>这将正确删除 Bullet删除 vector 时的对象。然而, vector 将变得不可复制(只能移动)。

但是如果 vector 应该拥有 Bullet无论如何,那么您可以直接将它们存储在 vector 中:std::vector<Bullet>

如果 vector 不应该拥有 Bullet那么删除它们的责任在于实际拥有它们的任何对象,但即便如此,也需要做出一些努力来确保已删除的指针不会保留在 vector 中。

关于c++ - 指针 vector 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53320959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com