字符串流<<运算符在循环中消耗大量内存
stringstream << operator consuming a lot of memory inside a loop
我有一个更新方法,它就像一个无限循环,因为它每帧都在运行。在这个方法中,我得到了一个float,我必须在每帧将其转换为字符串,以便在屏幕中发布socore。
我正在使用<lt;运算符,它允许我将浮点值复制到字符串流,然后,我使用str()函数来获取流的字符串值。
在头文件中,我声明了scoreString
、actualScore
和scoreLabel
。
update(dt){
actualScore += combo;
scoreString.str("");
scoreString << actualScore;
scoreLabel->setString(scoreString.str());
scoreString.clear();
}
actualScore
是我想要转换为字符串的浮点值。对于这个purpuse,我使用了一个scoreString对象,它是一个stringstream
。为了回收这个stringstream
,我使用了str("")
函数,它将值设置为零,因此我不必每次运行循环时都创建对象。
这段代码在cocos2dx应用程序中使用,并在IOS和android设备中运行。我只在安卓设备中内存不足。
这是我的logCat输出,但我认为它不会显示任何新内容。
01-12 15:35:25.271: D/dalvikvm(13948): GC_FOR_ALLOC freed 297K, 6% free 9580K/10160K, paused 20ms, total 20ms
01-12 15:35:25.321: D/dalvikvm(13948): GC_FOR_ALLOC freed 297K, 6% free 9580K/10160K, paused 20ms, total 20ms
01-12 15:35:25.371: D/dalvikvm(13948): GC_FOR_ALLOC freed 297K, 6% free 9580K/10160K, paused 21ms, total 21ms
01-12 15:35:25.421: D/dalvikvm(13948): GC_FOR_ALLOC freed 297K, 6% free 9580K/10160K, paused 19ms, total 19ms
01-12 15:35:25.472: D/dalvikvm(13948): GC_FOR_ALLOC freed 297K, 6% free 9580K/10160K, paused 18ms, total 18ms
01-12 15:35:25.522: D/dalvikvm(13948): GC_FOR_ALLOC freed 297K, 6% free 9580K/10160K, paused 14ms, total 14ms
01-12 15:35:25.572: D/dalvikvm(13948): GC_FOR_ALLOC freed 298K, 6% free 9581K/10160K, paused 15ms, total 16ms
...
编辑我根据注释中的建议修改了代码,但它不起作用。此外,我通过更新(dt)来更改while(true),这是运行这段代码的真实方法。
EDIT2这是sprintf版本,正如我所说,这也会消耗大量内存。此外,我还将actualScore的类型更改为int。在头文件中,我将score声明为char score[16];
update(dt){
actualScore += combo;
sprintf(score, "%d", actualScore);
scoreLabel->setString(score);
}
我使用的标签是CCLabelTTF,它速度慢,浪费了大量内存。我开始使用更快的CCLabelBMFont,解决了内存分配问题。
我在http://www.cocos2d-x.org/wiki/Text_Labels其中它解释了cocos2d-x具有的不同类型标签的使用。
我使用了字符串流<lt;有一次在我的代码中,它导致了异常的内存泄漏和android应用程序中的应用程序崩溃。避免它,而是使用sprintf。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 迭代时从向量和内存中删除对象
- 呼叫运营商<<临时
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗