কেন পয়েন্টারটি নুলকে সেট করে মুছবে না?


127

আমি সর্বদা ভাবতাম যে মোছার পরে NULL তে পয়েন্টারটি স্বয়ংক্রিয়ভাবে সেট করা মানটির অংশ নয়। যদি এটি যত্ন নেওয়া হয় তবে অবৈধ পয়েন্টারটির কারণে অনেকগুলি ক্র্যাশ ঘটে না। তবে এই বলে যে আমি মানকটি কেন এটিকে সীমাবদ্ধ রেখেছিল তার কয়েকটি কারণ নিয়ে ভাবতে পারি:

  1. কর্মক্ষমতা:

    একটি অতিরিক্ত নির্দেশ deleteকার্য সম্পাদনকে ধীর করতে পারে ।

  2. এটি constপয়েন্টার কারণে হতে পারে ।

    তারপরে আবার স্ট্যান্ডার্ড এই বিশেষ ক্ষেত্রেটি অনুমান করার জন্য কিছু করতে পারত।

কেউ এটিকে অনুমতি না দেওয়ার সঠিক কারণগুলি কি জানেন?

উত্তর:


150

স্ট্রাস্ট্রপ নিজেই উত্তর দেয়। একটি অংশ:

সি ++ স্পষ্টরূপে মুছে ফেলার একটি প্রয়োগকে একটি ল্যাভেলু অপারেন্ড শূন্য করার মঞ্জুরি দেয় এবং আমি আশাবাদী ছিল যে বাস্তবায়নগুলি এটি করবে, তবে এই ধারণাটি প্রয়োগকারীদের কাছে জনপ্রিয় হয়ে উঠেছে বলে মনে হয় না।

তবে তিনি উত্থাপিত মূল ইস্যুটি হ'ল মুছে ফেলার যুক্তিটির কোনও মূল্য নেই।


আমি মনে করি এটি আরও কিছু ব্যাখ্যা ব্যবহার করতে পারে। তিনি কী বলছেন তা আমি এখনও নিশ্চিত নই ... আমি মনে করি আমাকে পরবর্তী সময়ে ফিরে আসতে হবে যখন আমি কয়েক দম্পতি এটি না পাওয়া পর্যন্ত গবেষণার জন্য উত্সর্গ করতে পারি। অথবা, আমাদের আরও দ্রুত বুঝতে সাহায্য করার জন্য আপনি উত্তরটি ব্যাখ্যা করতে পারেন।
গ্যাব্রিয়েল স্ট্যাপলস

63

প্রথমে নালায় সেট করার জন্য একটি মেমরি স্টোরেজ ভেরিয়েবলের প্রয়োজন হবে। এটি সত্য, আপনার সাধারণত একটি চলকটিতে একটি পয়েন্টার থাকে তবে কখনও কখনও আপনি কেবল একটি গণনা করা ঠিকানায় কোনও বস্তু মুছতে চান । মুছে ফেলা "মুছে ফেলা" দিয়ে এটি অসম্ভব।

তারপরে আসে পারফরম্যান্স। আপনার লিখিত কোডটি এমনভাবে থাকতে পারে যাতে মোছার কাজটি মুছে ফেলার সাথে সাথেই সুযোগের বাইরে চলে যায় । নাল দিয়ে এটি পূরণ করা কেবল সময়ের অপচয়। এবং সি ++ এমন একটি ভাষা যা "এর দরকার নেই? তাহলে আপনার এর জন্য কোনও মূল্য দিতে হবে না" মতাদর্শ।

আপনার যদি সুরক্ষার প্রয়োজন হয় তবে আপনার পরিষেবাতে বিস্তৃত স্মার্ট পয়েন্টার রয়েছে বা আপনি নিজের লিখতে পারেন - আরও ভাল এবং স্মার্ট।


4
গুড পয়েন্ট রিট গণনা করা ঠিকানা, এমনকি যদি এটি এমন কিছু হয় যা আপনি প্রায়শই দেখেন না
স্নেমার্চ

আপনি কি নতুন বসানো সম্পর্কে কথা বলছেন যখন আপনি বলেন যে কখনও কখনও আপনি কেবল কোনও গণনা করা ঠিকানায় কোনও অবজেক্ট মুছতে চান। ???
ধ্বংসকারী

@ প্রবাসী মিঃ না, আমি এর অর্থ এমন কিছু করছিdelete (ptr + i)
ধারালো

39

আপনার সেই স্মৃতিতে নির্দেশ করে একাধিক পয়েন্টার থাকতে পারে। আপনি মুছে ফেলার জন্য নির্দিষ্ট করা পয়েন্টারটি বাতিল হয়ে গেলে সেটি সুরক্ষার একটি মিথ্যা ধারণা তৈরি করবে, তবে অন্য সমস্ত পয়েন্টারগুলি তা মানেনি। একটি পয়েন্টার ঠিকানা, সংখ্যা ছাড়া আর কিছুই নয়। এটি পাশাপাশি একটি dereferences অপারেশন সঙ্গে একটি int হতে পারে। আমার বক্তব্যটি হ'ল আপনি কেবলমাত্র মুছে ফেলা একই মেমরিটির উল্লেখ করে যাগুলি খুঁজে পেতে প্রত্যেকটি পয়েন্টার স্ক্যান করতে হবে এবং সেগুলিও বাতিল করতে হবে। এই ঠিকানার জন্য সমস্ত পয়েন্টার স্ক্যান করা এবং সেগুলি বাতিল করে দেওয়া গণনাগতভাবে তীব্র হবে কারণ ভাষাটির জন্য এটি ডিজাইন করা হয়নি। (যদিও কিছু অন্যান্য ভাষায় একই ধরণের লক্ষ্য ভিন্ন উপায়ে সম্পাদনের জন্য তাদের রেফারেন্সগুলি গঠন করে))


19

একটি পয়েন্টার একাধিক ভেরিয়েবলে সংরক্ষণ করা যায়, এর মধ্যে একটিকে NUL এ সেট করা অন্য ভেরিয়েবলগুলিতে অবৈধ পয়েন্টারগুলি রেখে যাবে। সুতরাং আপনি সত্যিই খুব বেশি লাভ করেন না, আপনি সম্ভবত সুরক্ষার একটি মিথ্যা ধারণা তৈরি করছেন।

এগুলি ছাড়াও, আপনি নিজের ফাংশন তৈরি করতে পারেন যা আপনি যা চান তা করে:

template<typename T>
void deleten(T *&ptr) {
  delete ptr;
  ptr = NULL;
}

12

কারণ সত্যিকারের কোনও প্রয়োজন নেই এবং কারণ এটির জন্য কেবল পয়েন্টারের চেয়ে পয়েন্টার-টু-পয়েন্টার নেওয়া মুছতে হবে।


সত্য, তবে এটি একই ওভারহেডের ফলাফল করবে
স্নেমার্চ করুন

7

deleteবেশিরভাগ ধ্বংসকারীদের মধ্যে ব্যবহার করা হয়, এক্ষেত্রে NULL এ সদস্য নির্ধারণ করা অর্থহীন। কয়েক লাইন পরে, সমাপ্তিতে }, সদস্যটির আর উপস্থিতি নেই। অ্যাসাইনমেন্ট অপারেটরগুলিতে, মুছে ফেলা সাধারণত কোনও অ্যাসাইনমেন্ট অনুসরণ করে।

এছাড়াও, এটি নিম্নলিখিত কোডটি অবৈধভাবে রেন্ডার করবে:

T* const foo = new T;
delete foo;

6

এখানে আরও একটি কারণ রয়েছে; ধরুন মোছা মুছে ফেলার কারণে তার যুক্তিটি সেট করে:

int *foo = new int;
int *bar = foo;
delete foo;

বার কি নুল সেট করা উচিত? আপনি এই সাধারণ করতে পারেন?


5

আপনার যদি পয়েন্টারের একটি অ্যারে থাকে এবং আপনার দ্বিতীয় ক্রিয়াটি খালি অ্যারেটি মুছে ফেলা হয় তবে মেমরিটি যখন মুক্ত হতে চলেছে তখন প্রতিটি মান শূন্য করার কোনও বিন্দু নেই। আপনি যদি এটি শূন্য হতে চান .. এটিতে নাল লিখুন :)


4

সি ++ আপনাকে নতুন নিজের অপারেটরটি সংজ্ঞায়িত করতে এবং মুছতে দেয় যাতে উদাহরণস্বরূপ তারা আপনার নিজের পুল বরাদ্দকারীকে ব্যবহার করতে পারে। আপনি যদি এটি করেন তবে নতুন ব্যবহার এবং এমন জিনিসগুলি মুছে ফেলা সম্ভব যা কঠোরভাবে ঠিকানা হয় না তবে আপনার পুল অ্যারেতে সূচকগুলি বলে। এই প্রসঙ্গে NULL (0) এর মানটির একটি আইনী অর্থ হতে পারে (পুলের প্রথম আইটেমটি উল্লেখ করে)।
সুতরাং NUL সেটটি স্বয়ংক্রিয়ভাবে তার যুক্তিতে মুছে ফেলার সাথে সর্বদা এর অর্থ হয় না - মানটিকে একটি অবৈধ মান হিসাবে সেট করুন। অবৈধ মান সর্বদা নাল নয়।


4

সি ++ এর দর্শনটি "আপনি যদি এটি ব্যবহার করেন তবেই এর জন্য অর্থ প্রদান করুন"। আমি মনে করি এটি আপনার প্রশ্নের উত্তর দিতে পারে।

এছাড়াও কখনও কখনও আপনার নিজের গাদা থাকতে পারে যা মুছে ফেলা স্মৃতি পুনরুদ্ধার করবে .. বা কখনও কখনও পয়েন্টার কোনও ভেরিয়েবলের মালিকানাধীন নয়। বা পয়েন্টার কয়েকটি ভেরিয়েবলে সঞ্চিত - এটি কেবল শূন্যের মধ্যে একটি zero
আপনি দেখতে পাচ্ছেন এটিতে অনেকগুলি সমস্যা এবং সম্ভাব্য সমস্যা রয়েছে।


3

পয়েন্টারটি NULL এ স্বয়ংক্রিয়ভাবে সেট করা খারাপ পয়েন্টার ব্যবহারের সাথে বেশিরভাগ সমস্যার সমাধান করবে না। আপনি যদি এটিকে দু'বার মুছতে চেষ্টা করেন তবে কেবলমাত্র ক্রাশটি এড়াতে পারে। আপনি যদি এই জাতীয় পয়েন্টারে কোনও সদস্য ফাংশন কল করেন? এটি এখনও ক্রাশ হবে (ধরে নেওয়া যায় এটি সদস্য ভেরিয়েবল অ্যাক্সেস করে)। সি ++ আপনাকে নুল পয়েন্টারে কোনও ফাংশন কল করতে বাধা দেয় না বা পারফরম্যান্স দৃষ্টিকোণ থেকে এটি করা উচিত নয়।


-1

আমি লোককে এই প্রশ্নের অদ্ভুত উত্তর দিতে দেখছি।

ptr = NULL; এই জাতীয় সরল বিবৃতি কার্যকারিতা বিলম্বের কারণ কীভাবে হতে পারে?

আর একটি উত্তর বলছে যে আমরা একই মেমরি অবস্থানের দিকে ইঙ্গিত করে একাধিক পয়েন্টার রাখতে পারি। অবশ্যই আমরা পারি। এক্ষেত্রে একটি পয়েন্টারে মুছে ফেলা অপারেশনটি কেবল সেই পয়েন্টারটিকেই NULL তৈরি করতে পারে (যদি মুছতে পয়েন্টারটি NULL তৈরি করা হত) এবং অন্য পয়েন্টারটি নন-নুল হবে এবং মেমরির অবস্থানের দিকে নির্দেশ করবে যা বিনামূল্যে।

এর সমাধানটি হওয়া উচিত ছিল যে ব্যবহারকারীর একই অবস্থানের দিকে নির্দেশ করে সমস্ত পয়েন্টার মুছে ফেলা উচিত। অভ্যন্তরীণভাবে এটি যাচাই করা উচিত মেমরিটি ইতিমধ্যে মুক্ত না হওয়ার চেয়ে মুক্ত হয়েছে কিনা। কেবলমাত্র পয়েন্টারটি NULL করুন।

স্ট্রস্ট্রস্ট্র এই পদ্ধতিতে কাজ করতে মোছার নকশা করতে পারে। তিনি ভেবেছিলেন প্রোগ্রামাররা এটির যত্ন নেবে। তাই তিনি এড়িয়ে গেলেন।

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