stl里的list在函数里面使用出问题?

iamwho123 2009-08-20 06:56:38
程序片段如下:
list<char*> A::B(list<char*> in)
{
list<char*> li_out;
li_out.push_back("1");
return li_out;
}
但是在实际调试过程中,走到return li_out这一句没有问题,但在往下走一步就报错:
HEAP[test.exe]: Invalid Address specified to RtlValidateHeap( 00940000, 003E60B8 )
Windows 已在 ***.exe 中触发一个断点。
其原因可能是堆被损坏,这也说明 test.exe 中或它所加载的任何 DLL 中有 bug。

各位大虾帮看一下有什么问题,谢谢!!!
...全文
242 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
thy38 2009-08-20
  • 打赏
  • 举报
回复
我这样写了一个小测试例子,不知道能否反应LZ的意思:
#include <iostream>
#include <list>

using namespace std;

list<char*> a()
{
list<char*> t;
t.push_back("1");
return t;
}

int main()
{
list<char*> f = a();
cout << (*f.begin()) << endl;

return 0;
}


我用mingw和cl(vc8的)编译运行均无问题,请LZ再写明是什么问题。

另外LZ的程序写法有些问题,直接返回容器的效率是比较低的,因为你返回的是一个对象,那么在返回时,函数会将li_out拷贝给一个临时量,再将这个临时量拷贝给你使用返回值的地方。

这对int等内置类型没什么问题,但对STL容器,可能效率会很低。建议返回指针或者用引用参数。
mengde007 2009-08-20
  • 打赏
  • 举报
回复
li_out也是局部变量;
DreamFreeLancer 2009-08-20
  • 打赏
  • 举报
回复
想保持一个字符串列表,尽量不要用list<char*>而改用list<string>, 如果一定要用,你得非常熟悉STL,知道自己为什么要用list<char*>而不是list<string>, 如果用list<char*>, 你得保证push_back进去的char*的生存期至少不比list<char*>本身短,通常的做法就是只push_back new出来的char*, 并在list<char*>本身销毁时,负责手工delete其中的每个char*元素。 另外,返回list<char*>的做法也是有关问题的,应该将外部list<char*>直接以引用参数类型传入函数,函数中直接将char*元素 push_back进参数list. e.g.
typedef list<string> str_list_t;
void A::B(str_list_t& in, str_list_t& out)
{
out.push_back("1");
}
  • 打赏
  • 举报
回复
没看出问题,形参不用的话就别加在那里。
pigcoffee 2009-08-20
  • 打赏
  • 举报
回复
push_back的元素最好先new下,然后memset一下,试试看行么?

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧