社区
C++ 语言
帖子详情
如何删除list中的对象?
liaomingxue
2009-06-04 10:32:05
list<Student> list1;
list1.push_back((*)(new Student()));
list1.push_back((*)(new Student()));
那么如何删除中间创建的两个Student指针指向的内存空间?
...全文
896
20
打赏
收藏
如何删除list中的对象?
list list1; list1.push_back((*)(new Student())); list1.push_back((*)(new Student())); 那么如何删除中间创建的两个Student指针指向的内存空间?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
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
打赏
举报
回复
删不掉了。。。
iotthingsgraph-jvm-0.17.4-beta-sources.jar
iotthingsgraph-jvm-0.17.4-beta-sources.jar
rolesanywhere-jvm-1.1.15-sources.jar
rolesanywhere-jvm-1.1.15-sources.jar
基于PDFjs和html2canvasjs的在线PDF签名处理工具-实现PDF文件上传展示与签名板手写功能-支持签名图片去底色处理与拖拽定位-通过截取HTML元素保持高清晰度导.zip
stm32基于PDFjs和html2canvasjs的在线PDF签名处理工具_实现PDF文件上传展示与签名板手写功能_支持签名图片去底色处理与拖拽定位_通过截取HTML元素保持高清晰度导.zip
开源免费且支持 Docker 的 Java 博客系统所用框架介绍
【源码预览】:https://renmaiwang.cn/s/yiwoi 一款开源且免费的 Java 博客系统,运用了 spring-boot、spring-data-jpa、shiro、freemarker、bootstrap 等框架进行构建,同时对 Docker 提供支持。
iOS全局自动化 代码混淆 工具!支持cocoapod组件代码一并 混淆,完美避开hardcode方法、静态库方法和系统库方法!
【源码预览】:https://renmaiwang.cn/s/ez8f3 (最新版、最全版本)iOS全局自动化 代码混淆 工具!支持cocoapod组件代码一并 混淆,完美避开hardcode方法、静态库方法和系统库方法!
C++ 语言
65,199
社区成员
250,521
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章