如何删除list中的对象?

liaomingxue none 服务器端工程师  2009-06-04 10:32:05
list<Student> list1;
list1.push_back((*)(new Student()));
list1.push_back((*)(new Student()));

那么如何删除中间创建的两个Student指针指向的内存空间?
...全文
711 点赞 收藏 20
写回复
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
CHINAonlyQiu 2010-12-06
Student_list.erase(stud2);如果说其中的stud2是逆序的一个list对象,即list <stuInfo> :: reverse_iterator stud1,stud2;那将如何解决呢?好像是erase中没有这样的重载函数哦!
回复
iambic 2009-06-04
另外,那两个指针不是list中的对象。
回复
goodname 2009-06-04
这样用没法删除。必须得把指针保存下来才可以删除。

不必非的使用new,直接创建对象就行。
list1.push_back(Student());
回复
iambic 2009-06-04
滥用指针,没法删除了。
回复
liaomingxue 2009-06-04
[Quote=引用 9 楼 GS_Neo 的回复:]
UP,建议楼主看一下list的用法。。。。

STL中用erase()方法遍历删除元素
STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。
在使用 list、set 或 map遍历删除某些元素时可以这样使用:

正确使用方法1 std::list < int> List;
std::list < in…
[/Quote]

谢谢你的办法。但是你的办法不是解决我的问题的办法。因为list <Student>而不是list <Student*>。
10楼的兄弟说的还是有道理的。
回复
jkdfjkdf 2009-06-04
[Quote=引用 8 楼 liaomingxue 的回复:]

我也有同感,但别人定义了一个这样的类型,我也没有法子
[/Quote]

if 你可以改
用指针好了, 简单
else if 你不能改 && 能联系到那个别人
钉死他, 让他改
else if 人品好 {
拼人品, 反正程序结束就会被干掉, 只要调的不多, 泄露的就不厉害.
同情.
} else { /* 人品不好 */
扎小草人, 那小针扎 ...
更同情.
}
回复
GS_Neo 2009-06-04
UP,建议楼主看一下list的用法。。。。

STL中用erase()方法遍历删除元素
STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。
在使用 list、set 或 map遍历删除某些元素时可以这样使用:

正确使用方法1 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
itList = List.erase( itList);
}
else
itList++;
}



正确使用方法2 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
List.erase( itList++);
}
else
itList++;
}


下面是两个错误的使用方法:

错误使用方法1 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); itList++)
{
if( WillDelete( *itList) )
{
List.erase( itList);
}
}


错误使用方法2 std::list< int> List;
std::list< int>::iterator itList;
for( itList = List.begin(); itList != List.end(); )
{
if( WillDelete( *itList) )
{
itList = List.erase( ++itList);
}
else
itList++;
}

正确使用方法1:通过erase方法的返回值来获取下一个元素的位置
正确使用方法2:在调用erase方法之前先使用 “++”来获取下一个元素的位置
错误使用方法1:在调用erase方法之后使用“++”来获取下一个元素的位置,由于在调用erase方法以后,该元素的位置已经被删除,如果在根据这个旧的位置来获取下一个位置,则会出现异常。
错误使用方法2:同上。

这里“++”运算符与我们平常的理解刚好相反,erase( itList++) 是先获取下一个元素的位置在删除; erase( ++itList) 是删除以后再获取下一个元素的位置。

在使用 vector、deque遍历删除元素时,也可以通过erase的返回值来获取下一个元素的位置:
正确使用方法 std::vector< int> Vec;
std::vector< int>::iterator itVec;
for( itVec = Vec.begin(); itVec != Vec.end(); )
{
if( WillDelete( *itVec) )
{
itVec = Vec.erase( itVec);
}
else
itList++;
}
注意:vector、deque 不能像上面的“正确使用方法2”的办法来遍历删除。
回复
liaomingxue 2009-06-04
[Quote=引用 5 楼 jkdfjkdf 的回复:]
我怎么感觉这两个 new Student()无法删除呀, 为什么不用指针咧?
[/Quote]

我也有同感,但别人定义了一个这样的类型,我也没有法子
回复
liaomingxue 2009-06-04
[Quote=引用 5 楼 jkdfjkdf 的回复:]
我怎么感觉这两个 new Student()无法删除呀, 为什么不用指针咧?
[/Quote]

我也有同感,但别人定义了一个这样的类型,我也没有法子
回复
liaomingxue 2009-06-04
[Quote=引用 2 楼 codecola 的回复:]
先遍历,再delete, 然后erase
list <Student>::iterator it = list1.begin();
{
//找到要删除的元素
Student* p = *it;
delete p;
erase(it);
}
[/Quote]

这个不行,因为是list <Student>而不是list <Student*>
回复
jkdfjkdf 2009-06-04
我怎么感觉这两个 new Student()无法删除呀, 为什么不用指针咧?
回复
adventurelw 2009-06-04
要么创建有计数的智能指针或者句柄类封装
要么就是记住,什么时候不需要了遍历到那个位置删掉。
回复
wangyadong 2009-06-04
个人感觉不如压入指针,最后在删除list 元素的时候delete掉
回复
codecola 2009-06-04
先遍历,再delete, 然后erase
list<Student>::iterator it = list1.begin();
{
//找到要删除的元素
Student* p = *it;
delete p;
erase(it);
}
回复
w0911h 2009-06-04
好像只能自己定位到那两个对象指针,然后delete
回复
liuwg9999 2009-06-04
student *s=(student *)(&(*it));取的是什么呢?
回复
wanyuzhen 2009-06-04
push_back()函数存放的是一份Student对象的拷贝,
原来在堆区的匿名对象 new Student()无法删除
回复
jxwch 2009-06-04
为什么要加new呢?
回复
hongzao 2009-06-04
[Quote=引用楼主 liaomingxue 的帖子:]
list <Student> list1;
list1.push_back((*)(new Student()));
list1.push_back((*)(new Student()));

那么如何删除中间创建的两个Student指针指向的内存空间?
[/Quote]
你在堆中申请的那两块内存在push_back()函数结束的时候就已经泄漏了.
回复
atom210 2009-06-04
删不掉了。。。
回复
发动态
发帖子
C++ 语言
创建于2007-09-28

5.9w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
社区公告
暂无公告