C++ 删除向量中的指针时出现分段错误
当用户想要删除对象时,我正在尝试删除向量中的对象指针。我试图:C++ 删除向量中的指针时出现分段错误,c++,pointers,vector,C++,Pointers,Vector,当用户想要删除对象时,我正在尝试删除向量中的对象指针。我试图: 删除指针 从向量中删除指针 我在数据库类中有一个字符串到向量的映射。向量包含指向对象的指针。像这样: 在“database.h”中定义objectMap和objectector 我正在调试这个程序,我正在打印整个对象图,看看删除是否有效。问题是,即使函数确认删除(即返回true),删除后对象指针仍然存在。有人能解释一下发生了什么事吗 objectVector v = vec->second; 此按值复制向量,因此您指的是副本
objectMap
和objectector
我正在调试这个程序,我正在打印整个对象图,看看删除是否有效。问题是,即使函数确认删除(即返回true),删除后对象指针仍然存在。有人能解释一下发生了什么事吗
objectVector v = vec->second;
此按值复制向量,因此您指的是副本,而不是实向量
建议将该行改为
objectVector& v = vec->second; // Reference to the "real" vector
在使obj迭代器无效方面没有问题,因为一旦遇到删除元素,您就要退出函数。您的代码是错误的,至少因为您没有删除原始向量中的元素。使用对向量的引用
for(objectMap::iterator vec = objects.begin(); vec != objects.end(); ++vec)
{
objectVector &v = vec->second;
也考虑一种方法,当在向量中擦除一个元素后,向量变空,也许你还可以删除映射中的相应元素。 例如)未经测试)
但是
v.erase(obj)
是个问题吗?我只是删除一个对象,当我找到它时,我退出循环。我一直在想这个问题,但我仍然需要obj=v.erase(obj)代码>如果我在那里退出循环?我认为这只有在你继续循环的时候才有必要。你的意思是下次我想删除一个对象时,这是必要的吗?@patriques对,如果你要退出那里的循环,你就不需要它了。
objectVector& v = vec->second; // Reference to the "real" vector
for(objectMap::iterator vec = objects.begin(); vec != objects.end(); ++vec)
{
objectVector &v = vec->second;
bool DataBase::deleteId(int id)
{
bool modified = false;
for ( auto it1 = objects.begin(); !modified && it1 != objects.end(); ++it1 )
{
auto it2 = std::find_if( it1->second.begin(), it1->second.end(),
[&]( Object *o ) { return ( o->getId() == id ); } );
modified = it2 != it1->second.end();
if ( modified )
{
delete *it2;
it1->second.erase( it2 );
if ( it1->second.empty() ) it1 = objects.erase( it1 );
}
}
return modified;
}