Я слышал, что Python автоматизировал «сборку мусора», а C ++ - нет. Что это значит? - PullRequest
2 голосов
/ 07 октября 2009

Я слышал, что Python автоматизировал «сборку мусора», а C ++ - нет. Что это значит?

Ответы [ 6 ]

12 голосов
/ 07 октября 2009

Попробуйте читать на нем.

8 голосов
/ 07 октября 2009

Это означает, что пользователю python не нужно очищать свои динамически созданные объекты, как вы обязаны это делать в C / C ++.

Пример на C ++:

char *ch = new char[100];
ch[0]='a';
ch[1]='b';
//....
// somewhere else in your program you need to release the alocated memory.
delete [] ch; 
// use *delete ch;* if you've initialized *ch with new char; 

в питоне:

def fun():
    a=[1, 2] #dynamic allocation
    a.append(3)
    return a[0]

python сам заботится о "a" объекте.

4 голосов
/ 07 октября 2009

Из Википедии http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29:

...

Сборка мусора освобождает программиста от необходимости вручную обрабатывать выделение и освобождение памяти. В результате некоторые категории ошибок устранены или существенно уменьшены:

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

  • Двойные свободные ошибки, которые появляются, когда программа пытается освободить
    область памяти, которая уже
    бесплатно.

  • Некоторые виды утечек памяти, в которую программа не может освободить
    память, на которую больше нет ссылок
    по любой переменной, ведущей со временем
    до исчерпания памяти.

...

Основными принципами сбора мусора являются:

  1. Поиск объектов данных в программе, к которым невозможно получить доступ в будущем
  2. Восстановить ресурсы, используемые этими объектами
3 голосов
/ 07 октября 2009

Другие уже ответили на главный вопрос, но я хотел бы добавить, что сборка мусора возможна в C ++. Это не так автоматически, как в Python, но это выполнимо.

Умные указатели, вероятно, являются самой простой формой сборки мусора в C ++ - std::auto_ptr, boost::scoped_ptr, boost::scoped_array, которые освобождают память после уничтожения , В одном из предыдущих ответов есть пример, который можно переписать так:

boost::scoped_array<char> ch(new char[100]);
ch[0] = 'a';
ch[1] = 'b';
// ...
// boost::scoped_array will be destroyed when out of scope, or during unwind
// (i.e. when exception is thrown), releasing the array's memory

Есть также boost::shared_ptr, boost::shared_array, которые реализуют подсчет ссылок (например, Python). И есть полноценные сборщики мусора, которые предназначены для замены стандартных распределителей памяти, например Boehm gc .

2 голосов
/ 07 октября 2009

Это в основном означает, как они обрабатывают ресурсы памяти. Когда вам нужна память, вы обычно запрашиваете ее в ОС, а затем возвращаете ее обратно.

С python вам не нужно беспокоиться о его возврате, с C ++ вам нужно отследить то, что вы просили, и вернуть его обратно, один проще, другой - вы выбираете инструмент.

0 голосов
/ 07 октября 2009

Получив ответ, теперь лучше узнать минусы автоматической сборки мусора: он требует большого объема дополнительной памяти и не подходит для жестких сроков в реальном времени.

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