মুছুন বনাম মুছে ফেলুন [] অপারেটর সি ++ এ


136

মধ্যে পার্থক্য কি deleteএবং delete[]সি ++ মধ্যে অপারেটরদের?


আপনি এই প্রশ্নটি প্রাসঙ্গিক স্ট্যাকওভারফ্লো.com
11:41

7
মুছে ফেলা এবং মুছে ফেলার সমস্যাগুলি হ'ল আমি স্মার্ট পয়েন্টার পছন্দ করার একটি কারণ এবং vector<>যখনই পারি আমি অ্যারের পরিবর্তে ব্যবহার করি।
ডেভিড থর্নলে


@ ডেভিডথর্নলি আপনি যদি স্মার্ট পয়েন্টার ব্যবহার করেন তবে আপনাকে এখনও সেই অর্থে পার্থক্যটি জানতে হবে যে আপনাকে এখনও উদাহরণস্বরূপ না লিখতে std::unique_ptr<int>(new int[3])হবে, কারণ এটি deleteঅ্যারেতে নিয়মিত কল করবে যা অপরিজ্ঞাত আচরণ is পরিবর্তে আপনার ব্যবহার করতে হবেstd::unique_ptr<int[]>
আর্থার ট্যাকা

উত্তর:


151

deleteঅপারেটর মেমরির deallocates এবং সঙ্গে তৈরি করা একটি একক বস্তুর জন্য বিনাশকারী আহ্বান new

delete []অপারেটর সঙ্গে তৈরি বস্তুর একটি অ্যারে জন্য মেমরি এবং কল destructors deallocatesnew []

deleteকোনও পয়েন্টার ব্যবহার করে new []বা কোনও পয়েন্টার ব্যবহার করে delete []ফেরত অপরিবর্তিত newআচরণের ফলাফল।


3
আমি অবাক হয়েছি যদি নতুন []] ইনট বা চরের মতো আদিম ধরণের (অ্যারেস্টর / ডেস্ট্রাক্টর) অ্যারেতে মুছে ফেলা ব্যবহার করা অগত্যা অপরিজ্ঞাত আচরণের দিকে পরিচালিত করে। মনে হয় অ্যারি আকার প্রিমিটিভ টাইপগুলি ব্যবহার করার সময় কোথাও সঞ্চিত নয়।
থোমিল

21
মানক যদি এটি সম্পন্ন হয় তখন কী ঘটে তা সংজ্ঞায়িত না করে তবে এটি "অপরিজ্ঞাত আচরণ" সংজ্ঞা দ্বারা হয়, এমনকি যদি আপনার সংকলক নির্ধারিতভাবে আপনি এটি করতে চান তা করে। অন্য সংকলক সম্পূর্ণ আলাদা কিছু করতে পারে।
রব কে

যখন আমার কাছে "চর ** স্ট্রআরে" এর মতো সি স্ট্রিংগুলির একটি অ্যারে ছিল তখন আমি এই ত্রুটিটি করেছি। আপনার মতো যদি আমার মতো অ্যারে থাকে তবে আপনাকে অ্যারের মাধ্যমে পুনরাবৃত্তি করতে হবে এবং প্রতিটি উপাদান মুছে ফেলা / মুক্ত করতে হবে, তারপরে নিজেই মুছে ফেলুন / স্ট্রআরেই মুক্ত করুন। আমার যে অ্যারেতে রয়েছে সেটিতে "মুছুন []" ব্যবহার করা কার্যকর হয় না (যেহেতু উপরের মন্তব্যগুলি এবং উত্তর দ্বারা নির্দেশিত), এটি কল করে এটি, প্রতিটি স্লট আসলে মুক্ত করে না।
কাটিয়ানি

88

delete[]অপারেটর ডিলিট অ্যারে ব্যবহার করা হয়। deleteঅপারেটর অ-বিন্যাস বস্তু মুছে ফেলতে ব্যবহার করা হয়। এটি কল operator delete[]এবংoperator deleteঅ্যারে বা অ-অ্যারে অবজেক্টটি অ্যারে এর উপাদান বা নন-অ্যারে অবজেক্টের জন্য ডেস্ট্রাক্টরদের ডাকার পরে (শেষ পর্যন্ত) মেমরিটি মুছে ফেলার জন্য এটি যথাক্রমে ফাংশন করে।

নিম্নলিখিত সম্পর্কগুলি দেখায়:

typedef int array_type[1];

// create and destroy a int[1]
array_type *a = new array_type;
delete [] a;

// create and destroy an int
int *b = new int;
delete b;

// create and destroy an int[1]
int *c = new int[1];
delete[] c;

// create and destroy an int[1][2]
int (*d)[2] = new int[1][2];
delete [] d;

এটি newঅ্যারে তৈরি করে (সুতরাং, হয় new type[]বা newঅ্যারে টাইপ কনস্ট্রাক্টে প্রয়োগ করা হয় ), স্ট্যান্ডার্ড operator new[]অ্যারের এলিমেন্ট টাইপ শ্রেণিতে বা গ্লোবাল স্কোপে একটি সন্ধান করে এবং অনুরোধ করা মেমরির পরিমাণটি পাস করে। এটি চাইলে এর চেয়ে বেশি অনুরোধ করতে পারে N * sizeof(ElementType)(উদাহরণস্বরূপ উপাদানগুলির সংখ্যা সংরক্ষণ করার জন্য, তাই এটি পরে মুছে ফেলা হলে জানতে পারে যে কতগুলি ডেস্ট্রাক্টর কল করেছে)। ক্লাস যদি operator new[]মেমরির পরিমাণকে অতিরিক্ত হিসাবে অন্যটিকে ঘোষণা করেsize_t স্বীকৃতি দেয় তবে দ্বিতীয় প্যারামিটার বরাদ্দকৃত উপাদানগুলির সংখ্যা গ্রহণ করবে - এটি এটি যে কোনও উদ্দেশ্যে (ডিবাগিং, ইত্যাদি ...) এটি ব্যবহার করতে পারে।

জন্য newএকটি অ-বিন্যাস বস্তু তৈরি করে, এটি একটি জন্য চেহারা হবে operator newউপাদান এর ক্লাসে বা বিশ্বব্যাপী সুযোগ। এটি অনুরোধ করা মেমরির পরিমাণটি ( sizeof(T)সর্বদা সর্বদা) পাস করে ।

এর জন্য এটি delete[]অ্যারেগুলির উপাদান শ্রেণীর ধরণের অনুসন্ধান করে এবং তাদের ধ্বংসকারীদের কল করে। operator delete[]ব্যবহৃত ফাংশন উপাদান টাইপ এর ক্লাসে এক, অথবা যদি কেউ নেই বিশ্বব্যাপী সুযোগ তারপর হয়।

এর জন্য delete, যদি পয়েন্টারটি উত্তীর্ণ হয় তবে প্রকৃত অবজেক্টের ধরণের একটি বেস বর্গ হয়, বেস শ্রেণীর একটি ভার্চুয়াল ডেস্ট্রাক্টর থাকতে হবে (অন্যথায়, আচরণটি অপরিজ্ঞাত)। যদি এটি একটি বেস শ্রেণি না হয়, তবে class শ্রেণীর ডেস্ট্রাক্টর বলা হয় operator deleteএবং সেই শ্রেণিতে একটি বা বিশ্বব্যাপী operator deleteব্যবহৃত হয়। যদি একটি বেস শ্রেণিটি পাস করা হয়, তবে প্রকৃত অবজেক্ট টাইপের ডেস্ট্রাক্টরকে ডাকা হয় operator deleteএবং সেই শ্রেণীর সন্ধান পাওয়া যায়, বা যদি না থাকে তবে একটি বিশ্বব্যাপী operator deleteবলা হয়। তাহলে operator deleteক্লাসে ধরনের একটি দ্বিতীয় প্যারামিটার রয়েছে size_t, এটা উপাদান ডি-এলোকেট করা নম্বর পাবেন।


18

সি ++ malloc/ free, new/ delete, new[]/ এ বরাদ্দ / ডি-বরাদ্দ প্যাটার্নের এটির প্রাথমিক ব্যবহার delete[]

আমাদের সেগুলি অনুরূপভাবে ব্যবহার করা দরকার। তবে deleteএবং এর মধ্যে পার্থক্যের জন্য আমি এই বিশেষ বোঝাপড়াটি যুক্ত করতে চাইdelete[]

1) একক বস্তুরdelete জন্য বরাদ্দ মেমরি ডি-বরাদ্দ করতে ব্যবহৃত হয়

2) অবজেক্টগুলির অ্যারেরdelete[] জন্য বরাদ্দ করা মেমরিটি ডি-বরাদ্দ করতে ব্যবহৃত হয়

class ABC{}

ABC *ptr = new ABC[100]

যখন আমরা বলি new ABC[100], সংকলক কয়টি অবজেক্টকে বরাদ্দ করা দরকার সে সম্পর্কে তথ্য পেতে পারে (এখানে এটি 100) এবং তৈরি প্রতিটিটির জন্য কনস্ট্রাক্টরকে কল করবে

তবে তাত্পর্যপূর্ণভাবে যদি আমরা কেবল delete ptrএই ক্ষেত্রে ব্যবহার করি তবে সংকলকটি জানতে পারবে না যে ptrকয়টি অবজেক্ট ইঙ্গিত করছে এবং কেবলমাত্র 1 টি অবজেক্টের জন্য ডাস্ট্রাক্টরের কলিং এবং মেমরি মুছে ফেলবে (ধ্বংসকারীদের ডাকে এবং বাকি 99 টি অবজেক্টের বিলোপ ছেড়ে দেয়)। অতএব একটি স্মৃতি ফাঁস হবে।

সুতরাং আমাদের delete [] ptrএই ক্ষেত্রে ব্যবহার করা প্রয়োজন ।


3
এটি সঠিক উত্তর হওয়া উচিত। অন্য কোনও উত্তর পৃথক পার্থক্যের কথা উল্লেখ করে না: "তবে আনুষ্ঠানিকভাবে যদি আমরা কেবল এই ক্ষেত্রে ডিলিট পিটিআরটি ব্যবহার করি তবে সংকলক জানতে পারবে না যে পিটিআর কতগুলি অবজেক্টের দিকে ইঙ্গিত করছে এবং কেবলমাত্র 1 টি অবজেক্টের জন্য ডেস্ট্রাক্টরের কল এবং মেমরি মুছে ফেলবে"
ডন ল্যারিনেক্স

1
আমরা সি তে একই জিনিসটি কীভাবে অর্জন করব?
ডগাস উরাল

@ ডগাসুরাল কেন? সি তে কোনও ডেস্ট্রাক্টর নেই, সুতরাং আপনি কেবল free()এটি এবং এটি। আপনি যদি সিউডো-ডিস্ট্রাক্টর প্যাটার্ন ব্যবহার করেন তবে আপনাকে forলুপ ব্যবহার করে প্রতিটি বস্তুর জন্য একবার কল করতে হবে ।
কোটাউস্কাস

@ ডনলারিঙ্কস সঠিক পার্থক্য হ'ল এগুলি মিশ্রণ ফলস্বরূপ একটি অসুস্থ প্রোগ্রামে ফলাফল দেয়। একটি বাস্তবায়ন পারে কিভাবে জানি অনেক বস্তু ধ্বংস, অথবা এটি না করি । এটি যে ভুল বলা হয়েছিল তা জানার অনুমতি দেওয়া হয়েছে এবং সমস্যাটি কোথায় তা আপনাকে জানিয়ে প্রোগ্রামটি বাতিল করে দিন।
কালেথ

6

অপারেটরগুলি deleteএবং delete []যথাক্রমে সংযোজনকারীর মেমরি ম্যানেজারের জন্য উপলব্ধ বরাদ্দ মেমরিটিতে ফিরে newএবং তৈরি হওয়া অবজেক্টগুলি ধ্বংস করতে ব্যবহৃত হয় new[]

তৈরি করা অবজেক্টগুলি newঅবশ্যই অজানা দিয়ে ধ্বংস করা উচিত deleteএবং এর সাথে তৈরি অ্যারেগুলি new[]মুছে ফেলা উচিত delete[]


2

আমি যখন এই প্রশ্নটি জিজ্ঞাসা করলাম, তখন আমার আসল প্রশ্নটি ছিল, "দুজনের মধ্যে কোনও তফাত আছে? রানটাইমকে অ্যারের আকার সম্পর্কে তথ্য রাখতে হবে না, এবং তাই আমরা কোনটি বোঝাতে চাইছি তা তা বলতে সক্ষম হবে না?" এই প্রশ্নটি "সম্পর্কিত প্রশ্নগুলিতে" উপস্থিত হয় না, সুতরাং আমার মতো যারা তাদের সাহায্য করতে পারে, তার উত্তর এখানে: "আমাদের এমনকি মুছে ফেলা [] অপারেটরটি কেন দরকার?"


ফিরে এসে এটিকে স্থাপন করার জন্য ধন্যবাদ
জিফিউশন

0

deleteএকটি একক পয়েন্টার delete[]জন্য ব্যবহৃত হয় এবং একটি পয়েন্টার মাধ্যমে অ্যারে মুছে ফেলার জন্য ব্যবহৃত হয়। এটি আপনাকে আরও ভালভাবে বুঝতে সাহায্য করবে।


-6

ঠিক আছে .. সম্ভবত আমার মনে হয় এটি কেবল সুস্পষ্টর জন্য। অপারেটর deleteএবং অপারেটর delete[]পার্থক্যযুক্ত তবে deleteঅপারেটর অ্যারেও মুক্তি দিতে পারে।

test* a = new test[100];
delete a;

এবং ইতিমধ্যে এই কোডটির কোনও মেমোরি ফুটো নেই checked

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