删除指针向量中的指针所指向的对象
Deleting the object that a pointer in a vector of pointers points to
我有一个指针向量,指向动态分配的火星结构。我的add函数似乎工作得很好,但我担心我的delete函数没有正确删除对象和指针。你们能看看删除功能,告诉我在哪里可以解决这个问题吗?
struct Martian
{
string fname, lname, ssid;
Martian(string fname, string lname, string ssid) : fname(fname), lname(lname), ssid(ssid){}
};
class martianDatabase
{
public:
vector<Martian*> database;
martianDatabase();
void deleteMartian(string deletedID);
void addMartian(int &i, string f, string l, string id);
int iterator = 0, size = 0;
};
void martianDatabase::addMartian(int& i, string f, string l, string id)
{
this->database.push_back(new Martian(f, l, id));
i++;
}
void martianDatabase::deleteMartian(string deleteID)
{
int i = 0;
while (i < size +1)
{
if (this->database[i]->ssid == deleteID){
delete this->database[i];
size--;
break;
}
else ++i;
}
}
这将删除所有具有匹配ssid
值的Martian
对象。
void martianDatabase::deleteMartian( string deleteID )
{
auto martianIterator = database.begin();
while( martianIterator != database.end() )
{
if( (*martianIterator)->ssid == deleteID )
{
delete *martianIterator;
martianIterator = database.erase( martianIterator );
}
else
{
++martianIterator;
}
}
}
通过对指针调用delete,您将释放被指向对象使用的内存空间(事实上,内存不会被释放,但可以说它是可重用的)。
你在使用程序时会遇到的问题是,你删除了条目,然后缩小了向量的大小,但指针没有被删除,也没有设置为nullptr,这意味着你在尝试取消引用它时会遇到问题(你的代码只有在删除最后一个元素时才能工作)。
此外,您可以(应该?)使用c++11引入的新智能指针,在您的情况下,您可以用std::shared_ptr替换原始指针。
有关详细信息:http://en.cppreference.com/w/cpp/memory/shared_ptr
相关文章:
- 为什么指针对象没有调用默认构造函数
- 如何访问双指针对象中的方法
- 如何使用智能指针对象执行成员函数指针
- 调用带有指针对象错误的指针变量
- 如何从模板类重载创建的指针对象上的运算符?
- C++指针对象的运算符重载
- 如何初始化数组指针对象
- 如何打印出唯一指针对象向量中的值(基于范围的循环)?C++
- C++指针对象差异
- 涉及继承,指针对象的交易以及何时进行的问题
- 表达式必须在C 中具有指针对象类型
- 下标需要数组或指针类型表达式必须具有指针对象类型
- 字符指针对象和相应的字符数组元素比较
- 如何在 c++ 中克隆为弱指针对象
- 指针对象使用CPP中的指针表达式进行比较
- Visual Studio中智能指针对象的自定义视图
- 使用指针 /对象 /模板参数正确构成
- 如果我确定只有一个线程一次处理指针/对象,则C/C 仍应使用同步
- 如何将值分配给指针对象 c++
- 更改智能指针对象,然后访问它