【发布时间】:2011-08-06 15:57:24
【问题描述】:
我在使用 std::string 进行内存管理时遇到问题。
我有应用程序 - 带有分离线程的多线程服务器(我确实需要加入它们,它们将完成工作并退出),我发现一段时间后内存使用率很高。我已经开始试验问题出在哪里,我已经创建了演示问题的测试程序
#include <iostream>
#include <string>
#include <pthread.h>
pthread_t thread[100];
using namespace std;
class tst {
public:
tst() {
//cout << "~ Create" << endl;
}
~tst() {
//cout << "~ Delete" << endl;
}
void calc() {
string TTT;
for (int ii=0; ii<100000; ii++) {
TTT+="abcdenbsdmnbfsmdnfbmsndbfmsndb ";
}
}
};
void *testThread (void *arg) {
int cnt=*(int *) arg;
cout << cnt << " ";
tst *TEST=new tst;
TEST->calc();
delete TEST;
pthread_exit((void *)0);
}
int main (int argc, char * const argv[]) {
cout << "---------------------------------------------------" << endl;
sleep(5);
for (int oo=0; oo<100; oo++) {
pthread_create(&thread[oo], NULL, testThread, &oo);
pthread_detach(thread[oo]);
}
cout << endl;
cout << "---------------------------------------------------" << endl;
sleep(5);
for (int oo=0; oo<100; oo++) {
pthread_create(&thread[oo], NULL, testThread, &oo);
pthread_detach(thread[oo]);
}
cout << endl;
cout << "---------------------------------------------------" << endl;
sleep(5);
exit(0);
}
在第一个“---”之后内存使用量为 364KB,第二个为 19MB,第三个为 33.5MB。 还有一件奇怪的事情 - 每次运行都显示不同的内存使用情况,但大多数情况下,最后一次内存使用情况比第二个“---”之后多 50%。
我预计如果类 TEST (tst) 被删除,那么字符串也会释放其内存 - 我发现线程不会这样做 - 这就是我创建新 tst、运行它然后删除的原因.
在我的程序中,这导致了一个大问题,因为我在每个线程中使用的字符串很少,并且一段时间后内存使用量超过了 gig ;-(
有什么选项可以在字符串之后“清空”内存吗?
我试过 TTT="" 或 TTT.clear() 没有任何改变。
...我需要使用线程 - 它将在多 CPU 机器上运行,其中线程是使用它的“全功率”的唯一选项(据我所知)
【问题讨论】:
-
你如何测量内存使用情况?
-
@Doug T.:活动监视器 - Mac OSX
-
@tominko,我想知道操作系统是否在回收它分配的虚拟内存方面不是很积极。您可能被分配了一定数量但实际上并没有使用它。
-
你确定内存使用来自字符串吗?启动一个线程需要 相当 的内存量(至少一个页面用于页面描述符,另一个用于线程堆栈等)
-
有 100 个线程,每个线程创建一个 3MB 的字符串,我希望内存使用率更高:至少 300MB。然后考虑碎片化的内存。
标签: c++ string memory-management pthreads