C++ очень отличается от Java в этой области, так вот краткий обзор:
распределение: память резервируется для объекта.
строительство: объект готов к использованию.
уничтожение: объект «завершает» все и разбирает себя.
освобождение: память возвращается в систему.
int main() {
int myint; //automatic int object is allocated and constructed
//stuff
} // when main ends, automatic int object is destroyed and deallocated
int main() {
int* mypointer; //automatic pointer object is allocated and constructed
mypointer = new int; //dynamic int object is allocated and constructed
//stuff
delete mypointer; //dynamic int object is destroyed and deallocated
} // when main ends, automatic pointer object is destroyed and deallocated
// note: Pointers to _not_ delete the object they point to.
class myclass {
//members
public:
myclass() {} //this is the default constructor
myclass(const myclass& rhs) {} //this is the copy constructor
myclass& operator=(const myclass& rhs) {return *this} //this is the assignment operator
~myclass() {} //this is the destructor
};
Когда функция заканчивается, все переменные в самой функции (которые мы называем автоматические) имеют их деструкторы называется, а затем они освобождаться автоматически. Это означает, что объекты локальны для функции, они автоматически очищают себя моментально. Это также волшебным образом относится к членам класса. Когда он будет уничтожен, каждый из его членов будет автоматически уничтожен. Это означает, что большинство деструкторов пуст.
Если вы выделите материал вручную (с ключевым словом new
), он должен быть уничтожен и удален с использованием ключевого слова delete
. Когда вы вызываете delete
, он тут же будет уничтожать (и освобождать) и не будет продолжаться до тех пор, пока это не будет выполнено. Если вы забудете, он НИКОГДА НЕ ПОЛУЧИТ ДЕЙСТВУЮЩИЙ (все, операционные системы освободят его, когда закончится ваша программа).
Поскольку люди делают ошибки, «правильный», что нужно делать, когда вам нужно динамических объектов является:
int main() {
std::unique_ptr<myclass> myptr = new myclass(); //allocate and construct
} //both the unique_ptr and the dynamic object are destroyed and deallocated
и unique_ptr
достаточно умен, чтобы автоматически очистить вещь он указывает на, освобождая вас больше проблемы.
Причина C++ заключается в том, что если у вас есть объект F
, который представляет этот файл, он может иметь исключительную блокировку для этого файла. В C++, как только F
уничтожен, вы можете сразу создать объект G
, который использует тот же самый файл. В Java нет гарантии, что finalizer
будет запустится, что означает, что файл может оставаться заблокированным до завершения вашей программы. (Маловероятно, но возможно)
C++ не предоставляет сборку мусора (вы можете реализовать его, но это настоящая боль в заднице и обычно не требуется). У этого есть [RAII] (http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization), что делает деструкторы очень полезными. –
Найдите книгу. C++ и Java в этой области отличаются друг от друга как автомобиль и поезд. –
Вы читали статью, к которой вы связались? У C++ нет сборщика мусора. Ваши вопросы не имеют смысла. –