вектор держать память даже поменять местами с другим пустым вектором - PullRequest
1 голос
/ 01 июля 2011

Я провожу крошечный эксперимент, код выглядит следующим образом:

    vector<char> *p = new vector<char>[1024];
    for (size_t i = 0; i < 1024; i++) 
    {
        (*p++).resize(1024 * 1024);//alloc 1 G memory 
    }

    sleep(5);
    cout << "start to clear" << endl;
    for (size_t i = 0; i < 1024; i++)
    {
        vector<char> tmp;
        tmp.swap(*p++);
    }
    delete [] p;

    cout << "clear over!" << endl;
    sleep (5);

// здесь память все еще 1G, почему?большое спасибо.

Ответы [ 2 ]

5 голосов
/ 01 июля 2011

В большинстве реализаций память не возвращается ОС сразу, а скорее помещается в «свободный список», поскольку получение памяти из ОС зачастую намного дороже, чем просмотр такого свободного списка.Скорее всего, вы все равно видите 1 гигабайт памяти, где бы вы ни проверяли это.

Кроме того, в вашем коде я не вижу, куда вы сбрасываете p после резервирования всех векторов, вы в основном меняете местамипустой вектор с неинициализированной памятью, которая вам не принадлежит.

3 голосов
/ 01 июля 2011

Вы не сбросили p до его начального значения между двумя циклами.Второй цикл не очищает начальный p, он портится со случайной памятью после памяти, выделенной для начального p.

Я предлагаю вам использовать (*(p + i)) или (p + i)-> или p[i] вместо (*p++).Или, что еще лучше, используйте vector<vector<char> >.И вместо того, чтобы заменить местным вектором.используйте функцию-член clear ().

Редактировать: Вот две хорошие реализации

vector<char>* p = new vector<char>[1024];
for( size_t i = 0; i < 1024; i++ ){
    p[i].resize(1024 * 1024);
}
sleep(5);
cout << "start to clear" << endl;
for( size_t i = 0; i < 1024; i++ ){
    p[i].clear();
}
delete [] p;
cout << "clear over!" << endl;
sleep(5);

vector<vector<char> > p(1024);
for( size_t i = 0; i < 1024; i++ ){
    p[i].resize(1024 * 1024);
}
sleep(5);
cout << "start to clear" << endl;
for( size_t i = 0; i < 1024; i++ ){
    p[i].clear();
}
cout << "clear over!" << endl;
sleep(5);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...