new/ deleteএবং malloc/ এর মধ্যে পার্থক্য কী free?
সম্পর্কিত (সদৃশ?): কোন ক্ষেত্রে আমি ম্যালোক বনাম নতুন ব্যবহার করব?
new/ deleteএবং malloc/ এর মধ্যে পার্থক্য কী free?
সম্পর্কিত (সদৃশ?): কোন ক্ষেত্রে আমি ম্যালোক বনাম নতুন ব্যবহার করব?
উত্তর:
বৈশিষ্ট্যগুলির সারণী তুলনা:
Feature | new/delete | malloc/free
--------------------------+--------------------------------+-------------------------------
Memory allocated from | 'Free Store' | 'Heap'
Returns | Fully typed pointer | void*
On failure | Throws (never returns NULL) | Returns NULL
Required size | Calculated by compiler | Must be specified in bytes
Handling arrays | Has an explicit version | Requires manual calculations
Reallocating | Not handled intuitively | Simple (no copy constructor)
Call of reverse | Implementation defined | No
Low memory cases | Can add a new memory allocator | Not handled by user code
Overridable | Yes | No
Use of (con-)/destructor | Yes | No
প্রযুক্তিগতভাবে নতুন দ্বারা বরাদ্দ করা মেমরিটি 'ফ্রি স্টোর' থেকে আসে যখন ম্যালোক দ্বারা বরাদ্দকৃত স্মৃতি 'হিপ' থেকে আসে। এই দুটি ক্ষেত্র একই কিনা তা বাস্তবায়নের বিশদ, যা মলোক এবং নতুন মিশ্রিত হতে পারে না এমন অন্য কারণ।
If ptr is NULL, no operation is performed.
newঅপারেটর ফ্রি স্টোর থেকে মেমরি বরাদ্দ করে ( ডায়নামিক মেমোরি হিসাবেও পরিচিত) এবং হিপ )। ডায়নামিক স্টোরেজের সি ++ 14 স্ট্যান্ডার্ড, বিভাগ 3.7.4 বলছে "নতুন এক্সপ্রেশন (5.3.4) ব্যবহার করে প্রোগ্রাম এক্সিকিউশন চলাকালীন (1.9) অবজেক্টগুলি গতিশীলভাবে তৈরি করা যায় এবং মুছুন-এক্সপ্রেশন ব্যবহার করে ধ্বংস করা যায়।"
সর্বাধিক প্রাসঙ্গিক পার্থক্যটি হ'ল newঅপারেটর মেমরি বরাদ্দ করে তারপরে কনস্ট্রাক্টরকে deleteকল করে এবং ডেস্ট্রাক্টরকে কল করে তারপরে মেমরিটিকে অবনমিত করে।
newঅবজেক্টের deleteকর্টরকে ডেকে, ডটারকে কল করে।
malloc& freeশুধু বরাদ্দ এবং কাঁচা মেমরি মুক্তি।
new/ deleteহয় সি ++, malloc/ freeভাল পুরানো সি থেকে আসে
সি ++ এ, newকোনও অবজেক্ট কনস্ট্রাক্টরকে deleteকল করে এবং ডেস্ট্রাক্টরকে কল করে।
mallocএবং free, ওওর আগে অন্ধকার যুগ থেকে আগত, অবজেক্টের কোনও কোড কার্যকর না করে কেবল মেমরি বরাদ্দ এবং মুক্ত করে।
কেবল মিলগুলি হ'ল malloc/ newউভয়ই একটি পয়েন্টার ফেরত দেয় যা গাদা কিছু স্মৃতিকে সম্বোধন করে এবং তারা উভয়ই গ্যারান্টি দেয় যে একবার মেমরির এইরকম একটি ব্লক ফিরে আসার পরে, আপনি এটি মুক্ত / মোছা না করা ছাড়া এটি আর ফিরে আসবে না unless যে, তারা উভয় মেমরি "বরাদ্দ"।
যাইহোক, new/ deleteনির্বাহক, ডেস্ট্রাক্টর এবং অপারেটর ওভারলোডিংয়ের মাধ্যমে স্বেচ্ছাসেবী অন্যান্য কাজ সম্পাদন করুন। malloc/ freeশুধুমাত্র বরাদ্দ এবং বিনামূল্যে মেমরি।
প্রকৃতপক্ষে, newএটি পর্যাপ্তভাবে কাস্টমাইজযোগ্য যে এটি প্রয়োজনীয়ভাবে গাদা থেকে মেমরি ফিরিয়ে দেয় না, বা এমনকি মোটেও মেমরি বরাদ্দ করে না। তবে ডিফল্ট newহয়।
নতুন এবং ম্যালোকের মধ্যে প্রধান পার্থক্য হ'ল নতুন বস্তুর নির্মাণকারীকে অনুরোধ করে এবং সংশ্লিষ্ট কলটি মুছে ফেলার জন্য অবজেক্টের ডেস্ট্রাক্টরকে ডাকে।
অন্যান্য পার্থক্য রয়েছে:
newটাইপ-সেফ, mallocটাইপের জিনিস ফেরত দেয়void*
newত্রুটিতে একটি ব্যতিক্রম নিক্ষেপ করে, mallocফিরে আসে NULLএবং এর্ন সেট করে
newএটি একটি অপারেটর এবং ওভারলোড করা যায়, mallocএটি একটি ফাংশন এবং ওভারলোড করা যায় না
new[], যা অ্যারে বরাদ্দ দেয়, তার চেয়ে বেশি স্বজ্ঞাত এবং প্রকারের সুরক্ষিত malloc
malloc-ভুক্ত বরাদ্দের মাধ্যমে পুনরায় আকার দেওয়া যেতে পারে realloc, new- বরাদ্দ বরাদ্দগুলি পুনরায় আকার দেওয়া যায় না
mallocমেমরির একটি এন-বাইট অংশ newবরাদ্দ করতে পারে , অবশ্যই charধরণের অ্যারে বরাদ্দ করতে বলা উচিত
পার্থক্যগুলি দেখে, একটি সংক্ষিপ্তসারটি হ'ল সি-এস্কো, নতুন সি ++ - এস্কো। আপনার কোড বেসের জন্য উপযুক্ত মনে করে এমন একটি ব্যবহার করুন।
যদিও বিভিন্ন মেমরি বরাদ্দকরণ অ্যালগরিদম ব্যবহার করে নতুন ও ম্যালোক প্রয়োগ করা বৈধ, তবে বেশিরভাগ সিস্টেমে নতুন অভ্যন্তরীণভাবে ম্যালোক ব্যবহার করে প্রয়োগ করা হয়, ফলে সিস্টেম-স্তরের কোনও পার্থক্য পাওয়া যায় না।
কিছু জিনিস রয়েছে যা newতা mallocকরে না:
new object অবজেক্টটির কনস্ট্রাক্টরকে ফোন করে বস্তুটি তৈরি করেnew বরাদ্দ মেমরি টাইপকাস্টিং প্রয়োজন হয় না।সুতরাং, আপনি যদি ব্যবহার করেন mallocতবে আপনার উপরের বিষয়গুলি স্পষ্টভাবে করা দরকার যা সর্বদা ব্যবহারিক নয়। অতিরিক্তভাবে, অতিরিক্ত newলোড করা যায় কিন্তু mallocহতে পারে না।
এক কথায়, আপনি যদি সি ++ ব্যবহার newকরেন তবে যথাসম্ভব চেষ্টা করার চেষ্টা করুন ।
newএবং deleteসি ++ হয় আদিমগুলি যা কোনও শ্রেণির একটি নতুন উদাহরণ ঘোষণা করে বা এটি মুছে ফেলে (এভাবে উদাহরণস্বরূপ শ্রেণীর ধ্বংসকারীকে অনুরোধ করে)।
malloc এবং free সি ফাংশন হয় এবং এগুলি বরাদ্দ এবং ফ্রি মেমরি ব্লক (আকারে)।
দু'জন বরাদ্দ দেওয়ার জন্য গাদা ব্যবহার করে। mallocএবং freeতবুও এটি আরও "নিম্ন স্তরের" কারণ তারা কেবলমাত্র মেমরির একটি অংশ সংরক্ষণ করে যা সম্ভবত পয়েন্টারের সাথে যুক্ত হবে। সেই মেমোরির চারপাশে কোনও কাঠামো তৈরি করা হয় না (যদি না আপনি কোনও সি অ্যারেটিকে কাঠামো হিসাবে বিবেচনা করেন)।
নতুন এবং মুছে ফেলা সি ++ এ অপারেটর রয়েছে; যা খুব বেশি লোড করা যায়। ম্যালোক এবং ফ্রি সিতে ফাংশন করে;
নতুন থ্রো ব্যতিক্রম হলে ব্যর্থ হলে ম্যালোক নাল পিটিআর প্রদান করে।
malloc দ্বারা ফেরত ঠিকানা টাইপ করে আবার কাস্ট করা দরকার কারণ এটি (শূন্য *) ম্যালোক (আকার) নতুন টাইপড পয়েন্টারটি ফেরত দেয়।
malloc(), আমাদের অন্তর্ভুক্ত করতে হবে <stdlib.h> বা
<alloc.h>প্রোগ্রামের জন্য প্রয়োজন নেই যা প্রয়োজন হয় নাnew ।newএবং deleteঅতিরিক্ত লোড করা যায় কিন্তু mallocপারে না।newআমরা সেই ঠিকানাটি পাস করতে পারি যেখানে আমরা মেমরি বরাদ্দ করতে চাই তবে এটি ক্ষেত্রে সম্ভব নয় malloc।alloc.hমানক শিরোনাম নয়। <new>নতুন প্লেসমেন্ট ব্যবহার করা প্রয়োজন।
কীওয়ার্ড বা ফ্রি ফাংশন মোছার জন্য এই কোড। কিন্তু যখন 'malloc' বা 'new' ব্যবহার করে কোনও পয়েন্টার অবজেক্ট তৈরি করুন এবং ডেলোকট অবজেক্ট মেমরিটি মুছে ফেলুন এমনকি সেই অবজেক্ট পয়েন্টারটি ক্লাসে কল ফাংশন হতে পারে। এর পরে মুছে ফেলার পরিবর্তে ফ্রি ব্যবহার করুন তারপরে এটি নিখরচায় বিবৃতি দেওয়ার পরেও কাজ করে, তবে উভয়ই কেবল তখন পয়েন্টার অবজেক্ট ক্লাসে কাজ করতে কল করতে পারে না .. কোডটি নিম্নরূপ:
#include<iostream>
using namespace std;
class ABC{
public: ABC(){
cout<<"Hello"<<endl;
}
void disp(){
cout<<"Hi\n";
}
};
int main(){
ABC* b=(ABC*)malloc(sizeof(ABC));
int* q = new int[20];
ABC *a=new ABC();
b->disp();
cout<<b<<endl;
free(b);
delete b;
//a=NULL;
b->disp();
ABC();
cout<<b;
return 0;
}
আউটপুট:
Hello Hi 0x2abfef37cc20
1. নতুন সিনটেক্স ম্যালোক () এর চেয়ে সহজ
2.new/delete একটি অপারেটর যেখানে malloc () / ফ্রি () একটি ফাংশন।
3. নতুন / ডিলিট malloc () / ফ্রি () এর চেয়ে দ্রুত সম্পাদন করুন কারণ নতুন একত্রিত কোডটি সরাসরি সংকলক দ্বারা আটকানো হয়েছে।
৪.আমরা অপারেটরকে ওভারলডিংয়ের সাহায্যে প্রোগ্রামে নতুন / মুছে ফেলার অর্থ পরিবর্তন করতে পারি।