тупой вопрос - PullRequest
       9

тупой вопрос

0 голосов
/ 13 мая 2011

У меня есть следующий фрагмент кода:

customObject* object;
std::list<customObject> objects;
for(int i = 0; i < 10: ++i) {
   object = new customObject;
   object.getvalue(i);
   objects.push_back(*object);
}

Будет ли память освобождена при успешном выходе?

Извините, ребята. Сделал несколько ошибок)) исправлено

Ответы [ 9 ]

3 голосов
/ 13 мая 2011

Поскольку вы объявили std::list как:

std::list<customObject> objects; //not storing the pointers!

Тогда вам не нужно создавать customObject, используя new. Вы должны сделать это:

std::list<customObject> objects;
for(int i = 0; i < 10; ++i) {
   customObject object;
   object.getvalue(i);
   objects.push_back(object); //store the object, not pointer!
}

В C ++ 0x это можно сделать очень кратко с помощью лямбда-выражения, например:

std::list<customObject> objects(10);
int i=0;
std::for_each(objects.begin(),objects.end(),[&](customObject &obj){ 
     obj.getValue(i++);
 });
2 голосов
/ 13 мая 2011

Прежде всего ваш код не скомпилируется (используя оператор. По указателю, толкая список в себя). Вторые стандартные контейнеры освободят место, которое они выделяют, но не пространство, выделенное вами с помощью new, malloc и т. Д.

2 голосов
/ 13 мая 2011

Как только вы исправите синтаксические ошибки и на самом деле скомпилируете и запустите ваш код (при условии, что вы сохраните в new), вы потеряете десять customObject с.

Вы должны перебирать list и delete каждый имеющийся у вас экземпляр new 'd.

Подумайте, нужно ли вашему list содержатьуказатели ... Если это так, то подумайте об использовании умного указателя (но не std::auto_ptr).

Вероятно, лучше просто хранить сами объекты (что делает std::list<customObject> objects).

1 голос
/ 13 мая 2011

Во-первых, у вас есть несоответствие между типом std :: list и объектами, которые вы пытаетесь сохранить в нем.std::list<customObject> objects; Это создает список пользовательских объектов, а не пользовательских указателей.std::list<customObject*> objects; Это создает список указателей customObject.

Относительно того, будет ли освобождена память, когда список выйдет из области видимости;Обратите внимание, что список вызовет деструктор каждого элемента.Если учесть, что указатели (независимо от типа) на самом деле являются просто целочисленными представлениями адресов памяти, а не объектами с деструкторами;должно быть ясно, что в списке нет деструктора для вызова.Еще один способ подумать о том, что все контейнеры stl используют семантику значений и никогда не разыменовывают указатели.

0 голосов
/ 13 мая 2011

Не берите в голову синтаксические ошибки, которые у вас есть: ошибка при доступе к членам через указатель и подталкивание пуантиста к std::list.Что касается вашего вопроса:

Это зависит.По всем практическим причинам да : любая современная операционная система будет забирать память, выделенную для вашего процесса, после завершения процесса.

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

0 голосов
/ 13 мая 2011
нет

NO
Контейнеры STL не освобождают память, выделенную указателю, потому что они не знают, имеют ли они единоличное владение и, следовательно, несут ответственность за освобождение памяти.

0 голосов
/ 13 мая 2011

Память будет освобождена ОС, но только после выхода из программы.

Если вы хотите освободить память во время работы вашей программы, вам нужно вызвать delete для каждого сохраненного указателя.Или используйте Boost Pointer Container Library для автоматического освобождения указателей.Другое решение заключается в использовании std::vector< std::shared_pointer<Item> >.

0 голосов
/ 13 мая 2011

Ответ - нет ... Также я не уверен, что ваш код будет работать, так как вы пытаетесь сохранить указатель в списке без указателя.

0 голосов
/ 13 мая 2011

Нет, память не будет "освобождена". STL применяет семантику значений, и контейнер считает, что он «владеет» только «значением» указателя, а не объектом, на который ссылаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...