İkisi de malloc() C++'da ve new aynı amaç için kullanılır. Çalışma zamanında bellek ayırmak için kullanılırlar. Ancak malloc() ve new'un söz dizimi farklıdır. Malloc() ve new arasındaki temel fark, new'un bir operatör olması, malloc()'un ise bir standart kütüphane fonksiyonunda önceden tanımlanmış olmasıdır. stdlib başlık dosyası.
Yeni olan ne?
Yeni, çalışma zamanında belleği tahsis etmek için kullanılan bir bellek ayırma operatörüdür. Yeni operatör tarafından başlatılan bellek bir yığına ayrılır. Değişkene atanan belleğin başlangıç adresini döndürür. C++'daki new operatörünün işlevselliği, daha önce kullanılan malloc() işlevine benzer. C programlama dili . C++ malloc() işleviyle de uyumludur, ancak avantajları nedeniyle çoğunlukla new operatörü kullanılır.
Yeni operatörün sözdizimi
type variable = new type(parameter_list);
Yukarıdaki sözdiziminde
tip: New operatörü tarafından belleğin tahsis edildiği değişkenin veri tipini tanımlar.
engellenen Kişiler
değişken: Belleğe işaret eden değişkenin adıdır.
parametre_listesi: Bir değişkene başlatılan değerlerin listesidir.
Yeni operatör, belleği ayırmak için sizeof() operatörünü kullanmaz. Yeni operatör bir nesne için yeterli bellek ayırdığından yeniden boyutlandırmayı da kullanmaz. Bir nesneyi başlatmak için bildirim sırasında yapıcıyı çağıran bir yapıdır.
Yeni operatörün hafızayı bir yığına ayırdığını bildiğimiz gibi; bellek bir yığında mevcut değilse ve yeni operatör belleği ayırmaya çalışırsa, bu durumda istisna atılır. Kodumuz istisnayı işleyemezse program anormal bir şekilde sonlandırılacaktır.
New operatörünü bir örnek üzerinden anlayalım.
#include using namespace std; int main() { int *ptr; // integer pointer variable declaration ptr=new int; // allocating memory to the pointer variable ptr. std::cout << 'Enter the number : ' <>*ptr; std::cout << 'Entered number is ' <<*ptr<< std::endl; return 0; } < pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/80/malloc-vs-new-c.webp" alt="malloc() vs new in C++"> <h3>What is malloc()?</h3> <p>A malloc() is a function that allocates memory at the runtime. This function returns the void pointer, which means that it can be assigned to any pointer type. This void pointer can be further typecast to get the pointer that points to the memory of a specified type.</p> <p>The syntax of the malloc() function is given below:</p> <pre> type variable_name = (type *)malloc(sizeof(type)); </pre> <p> <strong>where,</strong> </p> <p> <strong>type:</strong> it is the datatype of the variable for which the memory has to be allocated.</p> <p> <strong>variable_name:</strong> It defines the name of the variable that points to the memory.</p> <p> <strong>(type*):</strong> It is used for typecasting so that we can get the pointer of a specified type that points to the memory.</p> <p> <strong>sizeof():</strong> The sizeof() operator is used in the malloc() function to obtain the memory size required for the allocation.</p> <h4>Note: The malloc() function returns the void pointer, so typecasting is required to assign a different type to the pointer. The sizeof() operator is required in the malloc() function as the malloc() function returns the raw memory, so the sizeof() operator will tell the malloc() function how much memory is required for the allocation.</h4> <p>If the sufficient memory is not available, then the memory can be resized using realloc() function. As we know that all the dynamic memory requirements are fulfilled using heap memory, so malloc() function also allocates the memory in a heap and returns the pointer to it. The heap memory is very limited, so when our code starts execution, it marks the memory in use, and when our code completes its task, then it frees the memory by using the free() function. If the sufficient memory is not available, and our code tries to access the memory, then the malloc() function returns the NULL pointer. The memory which is allocated by the malloc() function can be deallocated by using the free() function.</p> <p> <strong>Let's understand through an example.</strong> </p> <pre> #include #include using namespace std; int main() { int len; // variable declaration std::cout << 'Enter the count of numbers :' <> len; int *ptr; // pointer variable declaration ptr=(int*) malloc(sizeof(int)*len); // allocating memory to the poiner variable for(int i=0;i<len;i++) { std::cout << 'enter a number : ' <> *(ptr+i); } std::cout << 'Entered elements are : ' << std::endl; for(int i=0;i<len;i++) { std::cout << *(ptr+i) std::endl; } free(ptr); return 0; < pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/80/malloc-vs-new-c-2.webp" alt="malloc() vs new in C++"> <p>If we do not use the <strong>free()</strong> function at the correct place, then it can lead to the cause of the dangling pointer. <strong>Let's understand this scenario through an example.</strong> </p> <pre> #include #include using namespace std; int *func() { int *p; p=(int*) malloc(sizeof(int)); free(p); return p; } int main() { int *ptr; ptr=func(); free(ptr); return 0; } </pre> <p>In the above code, we are calling the func() function. The func() function returns the integer pointer. Inside the func() function, we have declared a *p pointer, and the memory is allocated to this pointer variable using malloc() function. In this case, we are returning the pointer whose memory is already released. The ptr is a dangling pointer as it is pointing to the released memory location. Or we can say ptr is referring to that memory which is not pointed by the pointer.</p> <p>Till now, we get to know about the new operator and the malloc() function. Now, we will see the differences between the new operator and the malloc() function.</p> <h3>Differences between the malloc() and new</h3> <img src="//techcodeview.com/img/c-tutorial/80/malloc-vs-new-c-3.webp" alt="malloc() vs new in C++"> <ul> <li>The new operator constructs an object, i.e., it calls the constructor to initialize an object while <strong>malloc()</strong> function does not call the constructor. The new operator invokes the constructor, and the delete operator invokes the destructor to destroy the object. This is the biggest difference between the malloc() and new.</li> <li>The new is an operator, while malloc() is a predefined function in the stdlib header file.</li> <li>The operator new can be overloaded while the malloc() function cannot be overloaded.</li> <li>If the sufficient memory is not available in a heap, then the new operator will throw an exception while the malloc() function returns a NULL pointer.</li> <li>In the new operator, we need to specify the number of objects to be allocated while in malloc() function, we need to specify the number of bytes to be allocated.</li> <li>In the case of a new operator, we have to use the delete operator to deallocate the memory. But in the case of malloc() function, we have to use the free() function to deallocate the memory.</li> </ul> <p> <strong>Syntax of new operator</strong> </p> <pre> type reference_variable = new type name; </pre> <p> <strong>where,</strong> </p> <p> <strong>type:</strong> It defines the data type of the reference variable.</p> <p> <strong>reference_variable:</strong> It is the name of the pointer variable.</p> <p> <strong>new:</strong> It is an operator used for allocating the memory.</p> <p> <strong>type name:</strong> It can be any basic data type.</p> <p> <strong>For example,</strong> </p> <pre> int *p; p = new int; </pre> <p>In the above statements, we are declaring an integer pointer variable. The statement <strong>p = new int;</strong> allocates the memory space for an integer variable.</p> <p> <strong>Syntax of malloc() is given below:</strong> </p> <pre> int *ptr = (data_type*) malloc(sizeof(data_type)); </pre> <p> <strong>ptr:</strong> It is a pointer variable.</p> <p> <strong>data_type:</strong> It can be any basic data type.</p> <p> <strong>For example,</strong> </p> <pre> int *p; p = (int *) malloc(sizeof(int)) </pre> <p>The above statement will allocate the memory for an integer variable in a heap, and then stores the address of the reserved memory in 'p' variable.</p> <ul> <li>On the other hand, the memory allocated using malloc() function can be deallocated using the free() function.</li> <li>Once the memory is allocated using the new operator, then it cannot be resized. On the other hand, the memory is allocated using malloc() function; then, it can be reallocated using realloc() function.</li> <li>The execution time of new is less than the malloc() function as new is a construct, and malloc is a function.</li> <li>The new operator does not return the separate pointer variable; it returns the address of the newly created object. On the other hand, the malloc() function returns the void pointer which can be further typecast in a specified type.</li> </ul> <hr></len;i++)></len;i++)></pre></*ptr<<>
Neresi,
tip: belleğin tahsis edilmesi gereken değişkenin veri tipidir.
değişken ismi: Belleğe işaret eden değişkenin adını tanımlar.
(tip*): Belleğe işaret eden belirli bir türdeki işaretçiyi alabilmemiz için tipleme için kullanılır.
ahh sn
boyutu(): sizeof() operatörü, tahsis için gereken bellek boyutunu elde etmek amacıyla malloc() işlevinde kullanılır.
Not: Malloc() işlevi geçersiz işaretçiyi döndürür, bu nedenle işaretçiye farklı bir tür atamak için tip ataması gerekir. malloc() işlevi ham belleği döndürdüğü için sizeof() operatörü, malloc() işlevinde gereklidir, dolayısıyla sizeof() operatörü, ayırma için ne kadar belleğin gerekli olduğunu malloc() işlevine söyleyecektir.
Yeterli hafıza yoksa realloc() fonksiyonu kullanılarak hafıza yeniden boyutlandırılabilir. Tüm dinamik bellek gereksinimlerinin yığın belleği kullanılarak karşılandığını bildiğimiz için, malloc() işlevi de belleği bir yığına ayırır ve işaretçiyi ona döndürür. Yığın belleği çok sınırlıdır, bu nedenle kodumuz çalışmaya başladığında kullanılan belleği işaretler ve kodumuz görevini tamamladığında free() işlevini kullanarak belleği boşaltır. Yeterli bellek yoksa ve kodumuz belleğe erişmeye çalışırsa malloc() işlevi NULL işaretçisini döndürür. Malloc() fonksiyonu tarafından ayrılan hafıza, free() fonksiyonu kullanılarak serbest bırakılabilir.
Bir örnek üzerinden anlayalım.
#include #include using namespace std; int main() { int len; // variable declaration std::cout << 'Enter the count of numbers :' <> len; int *ptr; // pointer variable declaration ptr=(int*) malloc(sizeof(int)*len); // allocating memory to the poiner variable for(int i=0;i<len;i++) { std::cout << \'enter a number : \' <> *(ptr+i); } std::cout << 'Entered elements are : ' << std::endl; for(int i=0;i<len;i++) { std::cout << *(ptr+i) std::endl; } free(ptr); return 0; < pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/80/malloc-vs-new-c-2.webp" alt="malloc() vs new in C++"> <p>If we do not use the <strong>free()</strong> function at the correct place, then it can lead to the cause of the dangling pointer. <strong>Let's understand this scenario through an example.</strong> </p> <pre> #include #include using namespace std; int *func() { int *p; p=(int*) malloc(sizeof(int)); free(p); return p; } int main() { int *ptr; ptr=func(); free(ptr); return 0; } </pre> <p>In the above code, we are calling the func() function. The func() function returns the integer pointer. Inside the func() function, we have declared a *p pointer, and the memory is allocated to this pointer variable using malloc() function. In this case, we are returning the pointer whose memory is already released. The ptr is a dangling pointer as it is pointing to the released memory location. Or we can say ptr is referring to that memory which is not pointed by the pointer.</p> <p>Till now, we get to know about the new operator and the malloc() function. Now, we will see the differences between the new operator and the malloc() function.</p> <h3>Differences between the malloc() and new</h3> <img src="//techcodeview.com/img/c-tutorial/80/malloc-vs-new-c-3.webp" alt="malloc() vs new in C++"> <ul> <li>The new operator constructs an object, i.e., it calls the constructor to initialize an object while <strong>malloc()</strong> function does not call the constructor. The new operator invokes the constructor, and the delete operator invokes the destructor to destroy the object. This is the biggest difference between the malloc() and new.</li> <li>The new is an operator, while malloc() is a predefined function in the stdlib header file.</li> <li>The operator new can be overloaded while the malloc() function cannot be overloaded.</li> <li>If the sufficient memory is not available in a heap, then the new operator will throw an exception while the malloc() function returns a NULL pointer.</li> <li>In the new operator, we need to specify the number of objects to be allocated while in malloc() function, we need to specify the number of bytes to be allocated.</li> <li>In the case of a new operator, we have to use the delete operator to deallocate the memory. But in the case of malloc() function, we have to use the free() function to deallocate the memory.</li> </ul> <p> <strong>Syntax of new operator</strong> </p> <pre> type reference_variable = new type name; </pre> <p> <strong>where,</strong> </p> <p> <strong>type:</strong> It defines the data type of the reference variable.</p> <p> <strong>reference_variable:</strong> It is the name of the pointer variable.</p> <p> <strong>new:</strong> It is an operator used for allocating the memory.</p> <p> <strong>type name:</strong> It can be any basic data type.</p> <p> <strong>For example,</strong> </p> <pre> int *p; p = new int; </pre> <p>In the above statements, we are declaring an integer pointer variable. The statement <strong>p = new int;</strong> allocates the memory space for an integer variable.</p> <p> <strong>Syntax of malloc() is given below:</strong> </p> <pre> int *ptr = (data_type*) malloc(sizeof(data_type)); </pre> <p> <strong>ptr:</strong> It is a pointer variable.</p> <p> <strong>data_type:</strong> It can be any basic data type.</p> <p> <strong>For example,</strong> </p> <pre> int *p; p = (int *) malloc(sizeof(int)) </pre> <p>The above statement will allocate the memory for an integer variable in a heap, and then stores the address of the reserved memory in 'p' variable.</p> <ul> <li>On the other hand, the memory allocated using malloc() function can be deallocated using the free() function.</li> <li>Once the memory is allocated using the new operator, then it cannot be resized. On the other hand, the memory is allocated using malloc() function; then, it can be reallocated using realloc() function.</li> <li>The execution time of new is less than the malloc() function as new is a construct, and malloc is a function.</li> <li>The new operator does not return the separate pointer variable; it returns the address of the newly created object. On the other hand, the malloc() function returns the void pointer which can be further typecast in a specified type.</li> </ul> <hr></len;i++)></len;i++)>
Yukarıdaki kodda func() fonksiyonunu çağırıyoruz. func() işlevi tamsayı işaretçisini döndürür. Func() fonksiyonu içerisinde bir *p işaretçisi tanımladık ve malloc() fonksiyonu kullanılarak bellek bu işaretçi değişkenine tahsis edildi. Bu durumda hafızası zaten serbest bırakılmış olan işaretçiyi döndürüyoruz. Ptr, serbest bırakılan hafıza konumunu işaret ettiği için sarkan bir işaretçidir. Veya ptr'nin işaretçinin işaret etmediği hafızayı kastettiğini söyleyebiliriz.
java anahtarı kutusu
Şu ana kadar yeni operatör ve malloc() fonksiyonu hakkında bilgi sahibi olduk. Şimdi new operatörü ile malloc() fonksiyonu arasındaki farkları göreceğiz.
Malloc() ve new arasındaki farklar
- New operatörü bir nesne oluşturur; yani, bir nesneyi başlatmak için yapıcıyı çağırır. malloc() işlev yapıcıyı çağırmaz. New operatörü yapıcıyı çağırır ve delete operatörü nesneyi yok etmek için yıkıcıyı çağırır. Malloc() ve new arasındaki en büyük fark budur.
- New bir operatördür, malloc() ise stdlib başlık dosyasında önceden tanımlanmış bir fonksiyondur.
- new operatörü aşırı yüklenebilirken malloc() işlevi aşırı yüklenemez.
- Bir yığında yeterli bellek yoksa, malloc() işlevi bir NULL işaretçisi döndürürken yeni operatör bir istisna atar.
- New operatöründe tahsis edilecek nesne sayısını belirtmemiz gerekirken malloc() fonksiyonunda tahsis edilecek bayt sayısını belirtmemiz gerekiyor.
- Yeni bir operatör olması durumunda, hafızayı serbest bırakmak için silme operatörünü kullanmamız gerekir. Ancak malloc() işlevi durumunda, belleği serbest bırakmak için free() işlevini kullanmamız gerekir.
Yeni operatörün sözdizimi
type reference_variable = new type name;
Neresi,
tip: Referans değişkeninin veri tipini tanımlar.
referans_değişkeni: İşaretçi değişkeninin adıdır.
yeni: Belleği tahsis etmek için kullanılan bir operatördür.
adı yazın: Herhangi bir temel veri türü olabilir.
Örneğin,
haritayı parçala
int *p; p = new int;
Yukarıdaki ifadelerde bir tamsayı işaretçi değişkeni bildiriyoruz. İfade p = yeni int; bir tamsayı değişkeni için bellek alanını ayırır.
Malloc()'un sözdizimi aşağıda verilmiştir:
int *ptr = (data_type*) malloc(sizeof(data_type));
sayı: Bir işaretçi değişkenidir.
veri tipi: Herhangi bir temel veri türü olabilir.
Örneğin,
int *p; p = (int *) malloc(sizeof(int))
Yukarıdaki ifade, belleği bir yığındaki bir tamsayı değişkeni için tahsis edecek ve ardından ayrılan belleğin adresini 'p' değişkeninde saklayacaktır.
- Öte yandan, malloc() işlevi kullanılarak ayrılan belleğin yeri free() işlevi kullanılarak serbest bırakılabilir.
- Bellek new operatörü kullanılarak tahsis edildikten sonra yeniden boyutlandırılamaz. Öte yandan, bellek malloc() işlevi kullanılarak tahsis edilir; daha sonra realloc() işlevi kullanılarak yeniden tahsis edilebilir.
- new'un yürütme süresi malloc() fonksiyonundan daha azdır çünkü new bir yapıdır ve malloc da bir fonksiyondur.
- New operatörü ayrı bir işaretçi değişkeni döndürmez; yeni oluşturulan nesnenin adresini döndürür. Öte yandan, malloc() işlevi, belirli bir türde daha fazla tür dönüşümü yapılabilecek geçersiz işaretçiyi döndürür.
*ptr<<>