gpt4 book ai didi

c++ - 无法删除和删除 vector 上的对象指针

转载 作者:行者123 更新时间:2023-11-30 04:27:16 25 4
gpt4 key购买 nike

我需要删除和删除 vector 上的对象指针。我看到这个问题Should we delete before or after erase for an pointer in the vector?但删除对象指针后无法删除。

如何解决?这是我的代码。

#include <iostream>
#include <vector>
using namespace std;

class Foo
{
public:
class bar
{
public:
Foo &_owner;
int _id;
bar(Foo &owner,int id) : _id(id), _owner(owner){}
void remove()
{
for(vector<bar*>::iterator it=_owner.vbar.begin();it<_owner.vbar.end();it++)
{
if((*it)->_id == _id)
{
//delete object pointer
delete * it;

//remove element
it = _owner.vbar.erase(it); // error on this line.
}
}
}
};
vector<bar*> vbar;
Foo()
{
// add 10 elements
for(int i=0;i<10;i++)
vbar.push_back(new bar(*this ,i));

// remove element at 3
vbar.at(3)->remove();
}
};

int main(int argc, char *argv[])
{
Foo foo;
return 0;
}

[已编辑]我通过从 Bar 类外部删除对象指针来解决这个问题(在 Foo 类上删除)像这样在 Foo 类上添加不再使用 bar id 的 vector 。

#include <iostream>
#include <vector>
using namespace std;

class Foo
{
public:
class bar
{
public:
Foo &_owner;
int _id;
bar(Foo &owner,int id) : _id(id), _owner(owner) {}
void remove()
{
_owner.removeId = _id;
_owner.removeHelper();
}
};
vector<bar*> vbar;
int removeId;
Foo()
{
removeId = -1;

// add 10 elements
for(int i=0; i<10; i++)
vbar.push_back(new bar(*this ,i));

// remove element at 3
vbar.at(3)->remove();
}
void removeHelper()
{
for(vector<bar*>::iterator it=vbar.begin(); it<vbar.end(); it++)
{
if((*it)->_id == removeId)
{
//delete object pointer
delete * it;

//remove element
it = vbar.erase(it);
break;
}
}
removeId = -1;
}
};

int main(int argc, char *argv[])
{
Foo foo;
return 0;
}

最佳答案

问题就藏在这里

//delete object pointer
delete * it;

在这种情况下相当于delete this

之后,使用当前对象的任何部分都是未定义的行为。下一轮循环不会开始工作。

关于c++ - 无法删除和删除 vector 上的对象指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11072179/

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