new vs malloc () и free () vs delete в C ++
Мы используем операторы new и delete в C ++ для динамического выделения памяти, тогда как функции malloc () и free () также используются для той же цели в C и C ++. Функциональные возможности new или malloc () и delete или free () кажутся одинаковыми, но они различаются по-разному.
Поведение по отношению к вызовам конструкторов и деструкторов различается следующим образом:
malloc () против нового ():
- malloc (): это функция библиотеки C, которая также может использоваться в C ++, в то время как оператор «новый» специфичен только для C ++.
- И malloc (), и new используются для динамического распределения памяти в куче. Но «new» вызывает конструктор класса, а «malloc ()» - нет.
Ниже приведена программа, иллюстрирующая функциональность new и malloc ():
CPP
// C++ program to illustrate malloc() // and new operator in C++ #include "bits/stdc++.h" using namespace std; // Class A class A { int a; public : int * ptr; // Constructor of class A A() { cout << "Constructor was Called!" << endl; } }; // Driver Code int main() { // Create an object of class A // using new operator A* a = new A; cout << "Object of class A was " << "created using new operator!" << endl; // Create an object of class A // using malloc operator A* b = (A*) malloc ( sizeof (A)); cout << "Object of class A was " << "created using malloc()!" << endl; return 0; } |
Вызван конструктор! Объект класса A создан с помощью оператора new! Объект класса A был создан с помощью malloc ()!
В приведенной выше программе мы ясно видим, что при создании объекта с использованием нового оператора был вызван конструктор по умолчанию, а при использовании функции malloc конструктор по умолчанию не был вызван.
бесплатно () против удаления:
- free () - это функция библиотеки C, которую также можно использовать в C ++, а «delete» - это ключевое слово C ++.
- free () освобождает память, но не вызывает деструктор класса, тогда как «delete» освобождает память, а также вызывает деструктор класса.
Ниже приведена программа, иллюстрирующая функциональность new и malloc ():
Ниже приведены программы для дополнительных иллюстраций:
Программа 1:
CPP
// C++ program to illustrate new, delete // malloc() and free() #include "bits/stdc++.h" using namespace std; // Class A class A { int a; public : int * ptr; // Constructor of class A A() { cout << "Constructor was Called!" << endl; } // Destructor of class A ~A() { cout << "Destructor was Called!" << endl; } }; // Driver Code int main() { // Object Created of class A A a; return 0; } |
Вызван конструктор! Призван Деструктор!
В приведенной выше программе деструктор по-прежнему вызывается, хотя оператор удаления не используется. Причина вызова деструктора - инструкция «return 0» . Этот оператор при выполнении в основной функции вызывает деструктор каждого класса, для которого был создан объект.
Чтобы избежать вызова деструктора, мы можем заменить выражение «return 0» на «exit (0)». Ниже приведен код того же:
Программа 2:
CPP
// C++ program to illustrate new, delete // malloc() and free() #include "bits/stdc++.h" using namespace std; // Class A class A { int a; public : int * ptr; // Constructor of class A A() { cout << "Constructor was Called!" << endl; } // Destructor of class A ~A() { cout << "Destructor was Called!" << endl; } }; // Driver Code int main() { // Object Created of class A A a; exit (0); } |
Вызван конструктор!
Программа 3:
CPP
// C++ program to illustrate new, delete // malloc() and free() #include "bits/stdc++.h" using namespace std; // Class A class A { int a; public : int * ptr; // Constructor of class A A() { cout << "Constructor was Called!" << endl; } // Destructor of class A ~A() { cout << "Destructor was Called!" << endl; } }; // Driver Code int main() { // Object Created of class A A *a = new A; return 0; } |
Вызван конструктор!
Вызов деструктора не происходит даже после использования оператора return 0 . Причина кроется в различии размещения объекта в классе. Когда мы создаем объект с именем класса имя_объекта в блоке создается, объект имеет автоматическую продолжительность хранения, т. Е. Он будет автоматически уничтожен при выходе из области видимости. Но когда мы используем new class_name, объект имеет динамическую продолжительность хранения, что означает, что его нужно удалить явно с помощью ключевого слова delete.