У меня проблема с управлением памятью с помощью 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);
}
после первого «---», использование памяти составляет 364 КБ, после второго - 19 МБ, после третьего33,5 МБ.также есть 1 странная вещь - каждый прогон показывает разное использование памяти, но в основном последнее использование памяти примерно на 50% больше, чем после второго «---».
я ожидал, что если класс TEST(tst) удаляется, тогда строка освобождает свою память - я обнаружил, что потоки этого не сделают - поэтому я создаю новый tst, запускаю его и затем удаляю.
в моей программе это вызываетбольшая проблема, потому что я использую там несколько строк в каждом потоке, и через некоторое время использование памяти превышает гигабайт; - (
есть ли опция, как «очистить» память после строки?
я пробовал TTT = "" или TTT.clear () без каких-либо изменений.
... мне нужно использовать потоки - он будет работать на машине с несколькими процессорами, где потоки являются единственной возможностьюиспользуй его "на полную мощность" (как я знаю)