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
};
Когда функция завершается, все переменные в самой функции (которую мы называем автоматической) вызывают свои деструкторы, а затем они автоматически освобождаются. Это означает, что для объектов, локальных для функции, они автоматически очищают instant , который заканчивается функцией. Это также относится магически к членам класса. Когда он будет уничтожен, каждый из его участников будет автоматически уничтожен. Это означает, что большинство деструкторов пусты.
Если вы распределяете вещи вручную (с ключевым словом 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
будет когда-либо работать, а это означает, что файл может оставаться заблокированным до завершения вашей программы. (Маловероятно, но возможно)