new vs malloc () и free () vs delete в C ++

Опубликовано: 16 Декабря, 2021

Мы используем операторы 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.

Хотите узнать больше о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровней C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .