奇怪的内存问题,string or list 的问题?

Dream_lover 2012-03-01 02:53:38
#include "iostream"
#include <list>

typedef std::list<std::string*> STDLIST;
typedef std::list<std::string*>::iterator STDLIST_ITE;

int main()
{
STDLIST *test_list = new STDLIST();

for (int j = 0; j < 100; ++j)
{
for (int i = 0; i < 20000; ++i)
{
std::string *str = new std::string("str");
str->reserve(i);

//delete str;
//str = NULL;
test_list->push_back(str);
}

unsigned int counter = 0;
while (!test_list->empty())
{
++counter;
std::string *ptr = test_list->front();
delete ptr;
ptr = NULL;

test_list->pop_front();
}
std::cout<<"counter="<<counter<<std::endl;

test_list->clear();

if (j%10 == 0)
{
std::cout<<"j="<<j<<",test_list->size="<<test_list->size()<<std::endl;
sleep(1);
}
}

if (test_list != NULL)
{
delete test_list;
test_list = NULL;
}

int pause;
std::cin>>pause;
}
...全文
359 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dream_lover 2013-01-25
  • 打赏
  • 举报
回复
根据后来的测试结果,应该是gblic的内存管理方式导致的,delete后没有立即释放 可以通过重载 new和delete,改成c的方式来(malloc和free)来验证。 结贴先。
Kevin_qing 2012-03-02
  • 打赏
  • 举报
回复

就是一个cache空间,回收的空间不马上释放,会保留部分,这样下次有分配请求的时候就可以直接从缓冲里面分配。
另外还可以在分配的时候多分配部分,这样不必每次分配内存都调用系统。

chen_q07 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kevin_qing 的回复:]
没问题,c++库内存管理模式的原因。

delete的内存,不一定立即返还给系统。由c++内存分配管理代码维护(也许分配策略属于lazy free的)。
[/Quote]
问下,什么叫lazy free?这是种什么机制?
Dream_lover 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bsnry 的回复:]
string 的reserve的问题

i=0的时候, str指向一个"str"的对象,这个对象的字符串大小是3, 然后又str->reserve(0),

有问题吗???
[/Quote]
这个没有问题的,reserve只是保证有这么多,如果已经分配的大于请求的,则无需处理
rendao0563 2012-03-02
  • 打赏
  • 举报
回复
stl容器不是这么用的. 直接定义就好. 不要new来new去.
bsnry 2012-03-01
  • 打赏
  • 举报
回复
string 的reserve的问题

i=0的时候, str指向一个"str"的对象,这个对象的字符串大小是3, 然后又str->reserve(0),

有问题吗???


Dream_lover 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 kevin_qing 的回复:]
没问题,c++库内存管理模式的原因。

delete的内存,不一定立即返还给系统。由c++内存分配管理代码维护(也许分配策略属于lazy free的)。
[/Quote]

有道理,根据测试情况看,应该是 libc的处理问题, 我们开始还怀疑 stl的内存池的问题,后来确认没有用到。
Kevin_qing 2012-03-01
  • 打赏
  • 举报
回复
没问题,c++库内存管理模式的原因。

delete的内存,不一定立即返还给系统。由c++内存分配管理代码维护(也许分配策略属于lazy free的)。

taodm 2012-03-01
  • 打赏
  • 举报
回复
不要把free -m太当回事。
chen_q07 2012-03-01
  • 打赏
  • 举报
回复
很久没用c++了,但我感觉应该是str->reserve(i);这句话的原因。

你可以查看下string的new,delete以及reserve的具体操作。既然内存不对,肯定是和内存相关的几个函数出的问题。先看看源代码吧。
ouyh12345 2012-03-01
  • 打赏
  • 举报
回复
用valgrind看内存问题
Dream_lover 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oldm4n 的回复:]
引用 1 楼 dream_lover 的回复:

这个程序很简单,执行到最后时(linux下),程序占用的内存没有释放,不明白原因。

你怎么确定是没有被释放的?感觉lz是误解了linux的内存管理方式
[/Quote]

我是用free -m 来观察的, 使用的内存增多,而缓存没有变大, 应该和linux的内存使用方式无关。
oldm4n 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dream_lover 的回复:]

这个程序很简单,执行到最后时(linux下),程序占用的内存没有释放,不明白原因。
[/Quote]
你怎么确定是没有被释放的?感觉lz是误解了linux的内存管理方式
Dream_lover 2012-03-01
  • 打赏
  • 举报
回复
这个代码是用来测试内存问题的,没有实际用途。
Dream_lover 2012-03-01
  • 打赏
  • 举报
回复
代码格式有点不整齐(贴代码时被csdn改了格式), 但代码很少,相信很容易看完
Dream_lover 2012-03-01
  • 打赏
  • 举报
回复
这个程序很简单,执行到最后时(linux下),程序占用的内存没有释放,不明白原因。

64,282

社区成员

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

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