নতুন / মোছা এবং ম্যালোক / ফ্রি এর মধ্যে পার্থক্য কী?


উত্তর:


466

নতুন / ডিলিট

  • বরাদ্দ / মুক্তি মেমরি
    1. 'ফ্রি স্টোর' থেকে মেমরি বরাদ্দ
    2. পুরোপুরি টাইপড পয়েন্টারটি দেয়।
    3. নতুন (স্ট্যান্ডার্ড সংস্করণ) কখনই কোনও নুল ফেরায় না (ব্যর্থতা ছুঁড়ে দেবে)
    4. টাইপ-আইডি দিয়ে কল করা হয় (সংকলক আকার গণনা করে)
    5. অ্যারে হ্যান্ডেল করার জন্য স্পষ্টভাবে একটি সংস্করণ রয়েছে।
    6. পুনঃনির্ধারণ (আরও জায়গা পাওয়ার জন্য) স্বজ্ঞাতভাবে পরিচালনা করা হয়নি (অনুলিপি নির্মাণকারীর কারণে)।
    7. তারা malloc / ফ্রি কল করুন কিনা বাস্তবায়ন সংজ্ঞায়িত করা হয়।
    8. স্বল্প স্মৃতি (set_new_handler) ডিল করতে একটি নতুন মেমরি বরাদ্দকারী যুক্ত করতে পারে
    9. অপারেটর নতুন / ডিলিট আইনত ওভাররাইড করা যায়
    10. কনস্ট্রাক্টর / ডেস্ট্রাক্টর অবজেক্টটি আরম্ভ / ধ্বংস করতে ব্যবহৃত হয়

যদি malloc / বিনামূল্যে

  • মেমরি বরাদ্দ / ছেড়ে দেয়
    1. 'গাদা' থেকে মেমরি বরাদ্দ
    2. একটি শূন্য ফেরত *
    3. ব্যর্থতার পরে NULL প্রদান করে
    4. বাইটে প্রয়োজনীয় আকারটি নির্দিষ্ট করতে হবে।
    5. অ্যারে বরাদ্দ করতে স্থানের ম্যানুয়াল গণনা প্রয়োজন।
    6. মেমরির বৃহত্তর অংশটিকে পুনরায় প্রকাশ করা (উদ্বেগের জন্য কোনও অনুলিপি নির্মাণকারী নেই)
    7. তারা নতুন / ডিলিট কল করবে না
    8. কম মেমরির সাহায্যে ব্যবহারকারীর কোডকে বরাদ্দ ক্রমটিতে বিভক্ত করার কোনও উপায় নেই।
    9. যদি malloc / মুক্ত করতে না উপেক্ষিত আইনত হতে

বৈশিষ্ট্যগুলির সারণী তুলনা:

 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                            

প্রযুক্তিগতভাবে নতুন দ্বারা বরাদ্দ করা মেমরিটি 'ফ্রি স্টোর' থেকে আসে যখন ম্যালোক দ্বারা বরাদ্দকৃত স্মৃতি 'হিপ' থেকে আসে। এই দুটি ক্ষেত্র একই কিনা তা বাস্তবায়নের বিশদ, যা মলোক এবং নতুন মিশ্রিত হতে পারে না এমন অন্য কারণ।


12
কেউ গাদা বিপরীতে "ফ্রি স্টোর" সম্পর্কিত বিস্তারিতভাবে সম্পাদনা করতে পারেন? একটি প্রক্রিয়া 'হিপ একটি সুপরিচিত ভাষা-স্বতন্ত্র (?) অপারেটিং-সিস্টেম-স্তরের ধারণা; "ফ্রি স্টোর" কোথা থেকে এসেছে?
einpoklum

1
@ আইনপোকলুম: এগুলি কেবল মেমরি অঞ্চলের নাম। "হিপ" হিসাবে পরিচিত ভাষা ধারণার সাথে বা "প্রক্রিয়া হিপ" এর ওএস ধারণাটির সাথে কোনও সম্পর্ক নেই। সি ++ ইচ্ছাকৃতভাবে প্ল্যাটফর্ম / ওএস / সংকলক নিরপেক্ষ হিসাবে সংজ্ঞায়িত করা হয়েছে। সুতরাং "প্রসেস হিপ" এর মতো একটি নির্দিষ্ট ওএস ধারণাটি ব্যবহার করা স্ট্যান্ডার্ডের নমনীয়তাটিকে ক্ষুন্ন করবে।
মার্টিন ইয়র্ক

4
@ উইন্টারলাইট: এটি সত্য ব্যবহৃত হত তবে আর থাকবে না। দেখুন: linux.die.net/man/3/free If ptr is NULL, no operation is performed.
মার্টিন ইয়র্ক

2
@ লোকি আস্তারি এটি 'হিপ', 'ফ্রি স্টোর' এবং 'গতিশীল মেমরি / স্টোরেজ' এর সমার্থক শব্দ হিসাবে দেখায়: বজরেন স্ট্রোস্ট্রপের সি ট্যুর অফ সি ++ তে তিনি বলেছিলেন " newঅপারেটর ফ্রি স্টোর থেকে মেমরি বরাদ্দ করে ( ডায়নামিক মেমোরি হিসাবেও পরিচিত) এবং হিপ )। ডায়নামিক স্টোরেজের সি ++ 14 স্ট্যান্ডার্ড, বিভাগ 3.7.4 বলছে "নতুন এক্সপ্রেশন (5.3.4) ব্যবহার করে প্রোগ্রাম এক্সিকিউশন চলাকালীন (1.9) অবজেক্টগুলি গতিশীলভাবে তৈরি করা যায় এবং মুছুন-এক্সপ্রেশন ব্যবহার করে ধ্বংস করা যায়।"
সর্বোচ্চ হাইবার

2
@ মাহেবার: এর অর্থ তারা একই হতে পারে। এবং বেশ কয়েকটি বাস্তবায়ন ম্যালোককে কল করে নতুন বাস্তবায়ন করে (অন্যান্য উপায়ে স্পষ্টভাবে অনুমোদিত নয়) নোট করুন। তবে বেশ কয়েকটি বাস্তবায়ন সেই স্মৃতি অঞ্চলগুলি সম্পূর্ণ পৃথক করে রাখে। তাদের আলাদা রাখার কারণ হ'ল এটি সি ++ মেমরি ম্যানেজমেন্ট কোডকে সি মেমরি পরিচালনার চেয়ে ভিন্ন উপায়ে অপ্টিমাইজ করতে দেয়। মুল বক্তব্যটি: সেগুলি একই হতে পারে তবে আপনি তারা ধরে নিতে পারবেন না।
মার্টিন ইয়র্ক

81

সর্বাধিক প্রাসঙ্গিক পার্থক্যটি হ'ল newঅপারেটর মেমরি বরাদ্দ করে তারপরে কনস্ট্রাক্টরকে deleteকল করে এবং ডেস্ট্রাক্টরকে কল করে তারপরে মেমরিটিকে অবনমিত করে।


22
কড়া কথা বলতে গেলে নতুন অপারেটর কেবল মেমরি বরাদ্দ করে। এটি নতুন এক্সপ্রেশন যা নতুন অপারেটরকে কল করে, তারপরে বরাদ্দকৃত মেমরিতে কনস্ট্রাক্টর চালায়।
ডন ওয়েকফিল্ড

আর একটি পার্থক্য হ'ল যেখানে স্মৃতি বরাদ্দ করা হয়। আমি সম্প্রতি কোথাও দেখেছি যে মলোক / ফ্রি হিপগুলিতে অপারেট করে, যখন নতুন / মোছার স্মৃতিতে অন্য একটি অঞ্চলে অপারেট করে যার নামটি এখন আমাকে বাদ দেয়। (যদিও এটি বলা বাহুল্য যে অন্য অঞ্চলটি সম্ভবত অন্য একটি গাদা হিসাবে বিবেচনা করা যেতে পারে))
রবিএইচ

2
@ এমজিবি: হ্যাঁ আপনি ঠিক বলেছেন যে বিষয়গুলি "অ্যাপ্লিকেশন হিপ" বা স্ট্যাকের জন্য বরাদ্দ করা হয়েছে। তবে @ রবএইচ উল্লেখ করছে যা স্ট্যান্ডার্ডটি "অ্যাপ্লিকেশন হিপ" এর বিভিন্ন অংশকে কল করে। "হিপ" রয়েছে যা থেকে malloc মেমরি বরাদ্দ করে এবং "ফ্রি স্টোর" যেখানে নতুন থেকে মেমরি বরাদ্দ করে। যদিও কিছু বাস্তবায়নে এই ক্ষেত্রগুলি ওভারল্যাপ করে (এটি একটি বাস্তবায়ন বিশদ)।
মার্টিন ইয়র্ক

1
আপনার বক্তব্যটি 100% সঠিক তবে জিজ্ঞাসিত প্রশ্নের উত্তর দেয় না, নীচের উত্তরটি দেখুন, এটি আপনার চেয়ে বেশি ভোট দেওয়ার কারণ রয়েছে।
মুরালি

1
আমি যা বলার চেষ্টা করছিলাম তা হল আপনার উত্তরটির অভাবের তুলনা হিসাবে যোগ্যতা অর্জনের জন্য কমপক্ষে ম্যালোক / ফ্রি সম্পর্কে উল্লেখ করা উচিত। তবুও, এটি একটি প্রাসঙ্গিক এবং নির্ভুল বক্তব্য, সুতরাং সমীক্ষা, আমি আশা করি আপনি আমার বক্তব্যটি বুঝতে পেরেছেন। যাইহোক, যদি কেবলমাত্র এসও আমাকে আমার ডাউনটাতে ফিরিয়ে নিতে দেয় তবে আমি আন্তরিকভাবে চাই would
মুরালি

30

newঅবজেক্টের deleteকর্টরকে ডেকে, ডটারকে কল করে।

malloc& freeশুধু বরাদ্দ এবং কাঁচা মেমরি মুক্তি।


কাঁচা স্মৃতি বলতে কী বোঝ?
ধ্বংসকারী

3
কাঁচা স্মৃতি এটি কিছুই করেনি। এটিতে এখনও কোনও অবজেক্ট তৈরি করা হয়নি, এটিতে কোনও কিছুই অনুলিপি করা হয়নি, এবং বেশিরভাগ ক্ষেত্রে পূর্ববর্তী বিষয়গুলি ওভাররাইট করা হয়নি।
জেমস করান

14

new/ deleteহয় সি ++, malloc/ freeভাল পুরানো সি থেকে আসে

সি ++ এ, newকোনও অবজেক্ট কনস্ট্রাক্টরকে deleteকল করে এবং ডেস্ট্রাক্টরকে কল করে।

mallocএবং free, ওওর আগে অন্ধকার যুগ থেকে আগত, অবজেক্টের কোনও কোড কার্যকর না করে কেবল মেমরি বরাদ্দ এবং মুক্ত করে।


9
"OO যেমন পণ্য সামনে অন্ধকার বয়সের থেকে আসছে" করছি ইঙ্গিত তোমার মত শব্দ যে নতুন / মুছুন হয় ভাল যদি malloc চেয়ে / বিনামূল্যে যখন বাস্তবে, তন্ন তন্ন ভালো বা খারাপ, তারা শুধু বিভিন্ন ব্যবহারসমূহ আছে। নোট করুন যে আমি সেই ছোঁয়া নই যা আপনাকে নীচে নামিয়েছে, আমি কেবল অনুমান করছি।
গ্রামীণ পেরো

13

সি ++ new/ এdelete রচয়িতা / বিনাশকারী তদনুসারে কল।

malloc/ freeকেবল গাদা থেকে মেমরি বরাদ্দ করুন। new/ deleteমেমরি বরাদ্দ।


10

কেবল মিলগুলি হ'ল malloc/ newউভয়ই একটি পয়েন্টার ফেরত দেয় যা গাদা কিছু স্মৃতিকে সম্বোধন করে এবং তারা উভয়ই গ্যারান্টি দেয় যে একবার মেমরির এইরকম একটি ব্লক ফিরে আসার পরে, আপনি এটি মুক্ত / মোছা না করা ছাড়া এটি আর ফিরে আসবে না unless যে, তারা উভয় মেমরি "বরাদ্দ"।

যাইহোক, new/ deleteনির্বাহক, ডেস্ট্রাক্টর এবং অপারেটর ওভারলোডিংয়ের মাধ্যমে স্বেচ্ছাসেবী অন্যান্য কাজ সম্পাদন করুন। malloc/ freeশুধুমাত্র বরাদ্দ এবং বিনামূল্যে মেমরি।

প্রকৃতপক্ষে, newএটি পর্যাপ্তভাবে কাস্টমাইজযোগ্য যে এটি প্রয়োজনীয়ভাবে গাদা থেকে মেমরি ফিরিয়ে দেয় না, বা এমনকি মোটেও মেমরি বরাদ্দ করে না। তবে ডিফল্ট newহয়।


7

নতুন এবং ম্যালোকের মধ্যে প্রধান পার্থক্য হ'ল নতুন বস্তুর নির্মাণকারীকে অনুরোধ করে এবং সংশ্লিষ্ট কলটি মুছে ফেলার জন্য অবজেক্টের ডেস্ট্রাক্টরকে ডাকে।

অন্যান্য পার্থক্য রয়েছে:

  • newটাইপ-সেফ, mallocটাইপের জিনিস ফেরত দেয়void*

  • newত্রুটিতে একটি ব্যতিক্রম নিক্ষেপ করে, mallocফিরে আসে NULLএবং এর্ন সেট করে

  • newএটি একটি অপারেটর এবং ওভারলোড করা যায়, mallocএটি একটি ফাংশন এবং ওভারলোড করা যায় না

  • new[], যা অ্যারে বরাদ্দ দেয়, তার চেয়ে বেশি স্বজ্ঞাত এবং প্রকারের সুরক্ষিত malloc

  • malloc-ভুক্ত বরাদ্দের মাধ্যমে পুনরায় আকার দেওয়া যেতে পারে realloc, new- বরাদ্দ বরাদ্দগুলি পুনরায় আকার দেওয়া যায় না

  • mallocমেমরির একটি এন-বাইট অংশ newবরাদ্দ করতে পারে , অবশ্যই charধরণের অ্যারে বরাদ্দ করতে বলা উচিত

পার্থক্যগুলি দেখে, একটি সংক্ষিপ্তসারটি হ'ল সি-এস্কো, নতুন সি ++ - এস্কো। আপনার কোড বেসের জন্য উপযুক্ত মনে করে এমন একটি ব্যবহার করুন।

যদিও বিভিন্ন মেমরি বরাদ্দকরণ অ্যালগরিদম ব্যবহার করে নতুন ও ম্যালোক প্রয়োগ করা বৈধ, তবে বেশিরভাগ সিস্টেমে নতুন অভ্যন্তরীণভাবে ম্যালোক ব্যবহার করে প্রয়োগ করা হয়, ফলে সিস্টেম-স্তরের কোনও পার্থক্য পাওয়া যায় না।


5

কিছু জিনিস রয়েছে যা newতা mallocকরে না:

  1. new object অবজেক্টটির কনস্ট্রাক্টরকে ফোন করে বস্তুটি তৈরি করে
  2. new বরাদ্দ মেমরি টাইপকাস্টিং প্রয়োজন হয় না।
  3. এটি বরাদ্দ করার জন্য প্রচুর পরিমাণে মেমরির প্রয়োজন হয় না, বরং এটি নির্মাণের জন্য বেশ কয়েকটি অবজেক্টের প্রয়োজন।

সুতরাং, আপনি যদি ব্যবহার করেন mallocতবে আপনার উপরের বিষয়গুলি স্পষ্টভাবে করা দরকার যা সর্বদা ব্যবহারিক নয়। অতিরিক্তভাবে, অতিরিক্ত newলোড করা যায় কিন্তু mallocহতে পারে না।

এক কথায়, আপনি যদি সি ++ ব্যবহার newকরেন তবে যথাসম্ভব চেষ্টা করার চেষ্টা করুন ।


4

এছাড়াও,

গ্লোবাল নতুন এবং ডিলিট ওভাররাইড করা যায়, ম্যালোক / ফ্রি পারবেন না।

আরও আরও নতুন এবং মুছুন প্রতি টাইপ ওভাররাইড করা যেতে পারে।


3

newএবং deleteসি ++ হয় আদিমগুলি যা কোনও শ্রেণির একটি নতুন উদাহরণ ঘোষণা করে বা এটি মুছে ফেলে (এভাবে উদাহরণস্বরূপ শ্রেণীর ধ্বংসকারীকে অনুরোধ করে)।

malloc এবং free সি ফাংশন হয় এবং এগুলি বরাদ্দ এবং ফ্রি মেমরি ব্লক (আকারে)।

দু'জন বরাদ্দ দেওয়ার জন্য গাদা ব্যবহার করে। mallocএবং freeতবুও এটি আরও "নিম্ন স্তরের" কারণ তারা কেবলমাত্র মেমরির একটি অংশ সংরক্ষণ করে যা সম্ভবত পয়েন্টারের সাথে যুক্ত হবে। সেই মেমোরির চারপাশে কোনও কাঠামো তৈরি করা হয় না (যদি না আপনি কোনও সি অ্যারেটিকে কাঠামো হিসাবে বিবেচনা করেন)।


1
সি ++ এ নতুন কোনও শ্রেণীর উদাহরণ ঘোষণা করে না। এটি (সাধারণত) গাদা থেকে একটি বরাদ্দ করে এবং এটি কিছুই ঘোষণা করে না। আপনি কেবলমাত্র ঘোষণা দিয়ে কোনও উদাহরণ ঘোষণা করতে পারেন, এটি ঘোষণার স্টোরেজ সময়কালের উপর নির্ভর করে কোনও ক্ষেত্রে এটি স্ট্যাকের উপর বা গ্লোবালগুলিতে থাকবে।
স্টিভ জেসোপ

ঠিক আছে, এটি ক্লাসের জন্য মেমরির স্থান বরাদ্দ করে তবে আপনি স্ট্যাকের মধ্যে একটি ক্লাস "ঘোষণা" করতে পারবেন না, স্ট্যাকের মধ্যে ক্লাসটি সংরক্ষণের প্রকৃত অর্থে নয়। ঘোষণায় ক্লাসের কেবলমাত্র পয়েন্টার জড়িত থাকে যা সর্বদা স্ট্যাকের মধ্যে বরাদ্দ করা হয় আসল স্মৃতিশ্রেণীটি ধারণ করে রাখা হয়।
জর্হে কর্ডোবা

হ্যা, তুমি পারো. প্রশ্ন ট্যাগ অনুসারে এটি সি ++, সুতরাং বস্তুগুলি স্ট্যাকটিতে যেতে পারে। এবং নতুন কোনও ঘোষণা নয়, এটি একটি অভিব্যক্তি। কোনও কিছুর ঘোষণা করা এবং এটি বরাদ্দ করা পৃথক জিনিস।
স্টিভ জেসোপ 27:40

2

নতুন এবং মুছে ফেলা সি ++ এ অপারেটর রয়েছে; যা খুব বেশি লোড করা যায়। ম্যালোক এবং ফ্রি সিতে ফাংশন করে;

নতুন থ্রো ব্যতিক্রম হলে ব্যর্থ হলে ম্যালোক নাল পিটিআর প্রদান করে।

malloc দ্বারা ফেরত ঠিকানা টাইপ করে আবার কাস্ট করা দরকার কারণ এটি (শূন্য *) ম্যালোক (আকার) নতুন টাইপড পয়েন্টারটি ফেরত দেয়।


2
  • নতুন একটি অপারেটর, অন্যদিকে malloc () একটি fucntion।
  • নতুন সঠিক ডেটা টাইপ দেয়, যখন malloc () বাতিল বাতিল * দেয় (টাইপ শূন্যের পয়েন্টার)।
  • malloc (), মেমোরিটি আরম্ভ হয় না এবং ডিফল্ট মান আবর্জনা হয়, তবে নতুন ক্ষেত্রে মেমরিটি ডিফল্ট মান দিয়ে শুরু হয়, যেমন অন্তর্নিহিত ক্ষেত্রে 'শূন্য (0)' এর মতো।
  • মুছুন এবং বিনামূল্যে () উভয়ই 'নুল' পয়েন্টারগুলির জন্য ব্যবহার করা যেতে পারে।

0
  • ব্যবহার করতে malloc(), আমাদের অন্তর্ভুক্ত করতে হবে <stdlib.h> বা <alloc.h>প্রোগ্রামের জন্য প্রয়োজন নেই যা প্রয়োজন হয় নাnew
  • newএবং deleteঅতিরিক্ত লোড করা যায় কিন্তু mallocপারে না।
  • প্লেসমেন্টটি ব্যবহার করে newআমরা সেই ঠিকানাটি পাস করতে পারি যেখানে আমরা মেমরি বরাদ্দ করতে চাই তবে এটি ক্ষেত্রে সম্ভব নয় malloc

1
alloc.hমানক শিরোনাম নয়। <new>নতুন প্লেসমেন্ট ব্যবহার করা প্রয়োজন।
এমএম

0

কীওয়ার্ড বা ফ্রি ফাংশন মোছার জন্য এই কোড। কিন্তু যখন '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

-3

1. নতুন সিনটেক্স ম্যালোক () এর চেয়ে সহজ

2.new/delete একটি অপারেটর যেখানে malloc () / ফ্রি () একটি ফাংশন।

3. নতুন / ডিলিট malloc () / ফ্রি () এর চেয়ে দ্রুত সম্পাদন করুন কারণ নতুন একত্রিত কোডটি সরাসরি সংকলক দ্বারা আটকানো হয়েছে।

৪.আমরা অপারেটরকে ওভারলডিংয়ের সাহায্যে প্রোগ্রামে নতুন / মুছে ফেলার অর্থ পরিবর্তন করতে পারি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.