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 () / ফ্রি () এর চেয়ে দ্রুত সম্পাদন করুন কারণ নতুন একত্রিত কোডটি সরাসরি সংকলক দ্বারা আটকানো হয়েছে।
৪.আমরা অপারেটরকে ওভারলডিংয়ের সাহায্যে প্রোগ্রামে নতুন / মুছে ফেলার অর্থ পরিবর্তন করতে পারি।