হ্যাঁ.
এটি কেবলমাত্র "ক্ষতি" করতে পারে তা হ'ল আপনার প্রোগ্রামে অদক্ষতা (একটি অপ্রয়োজনীয় স্টোর অপারেশন) প্রবর্তন করা - তবে বেশিরভাগ ক্ষেত্রে মেমরির ব্লক বরাদ্দকরণ এবং মুক্ত করার ব্যয়ের ক্ষেত্রে এই ওভারহেড তুচ্ছ হবে।
আপনি এটা করতে না থাকে, তাহলে আপনি হবে কিছু কদর্য পয়েন্টার derefernce বাগ এক দিন আছে।
আমি সর্বদা মুছে ফেলার জন্য ম্যাক্রো ব্যবহার করি:
#define SAFEDELETE(ptr) { delete(ptr); ptr = NULL; }
(এবং একটি অ্যারের জন্য সমান, বিনামূল্যে (), হ্যান্ডলগুলি প্রকাশ করে)
আপনি "স্ব মুছুন" পদ্ধতিগুলিও লিখতে পারেন যা কলিং কোডের পয়েন্টারটির একটি রেফারেন্স নেয়, তাই তারা কলিং কোডের পয়েন্টারটিকে NULL এ জোর করে। উদাহরণস্বরূপ, অনেকগুলি অবজেক্টের একটি সাবট্রি মুছতে:
static void TreeItem::DeleteSubtree(TreeItem *&rootObject)
{
if (rootObject == NULL)
return;
rootObject->UnlinkFromParent();
for (int i = 0; i < numChildren)
DeleteSubtree(rootObject->child[i]);
delete rootObject;
rootObject = NULL;
}
সম্পাদন করা
হ্যাঁ, এই কৌশলগুলি ম্যাক্রোগুলি ব্যবহার সম্পর্কে কিছু নিয়ম লঙ্ঘন করে (এবং হ্যাঁ, এই দিনগুলিতে আপনি সম্ভবত টেমপ্লেটগুলি দিয়ে একই ফলাফল অর্জন করতে পারেন) - তবে বহু বছর ধরে ব্যবহার করে আমি কখনও মৃত স্মৃতি অ্যাক্সেস করি নি - সবচেয়ে প্রাচীন এবং অন্যতম জটিল এবং ডিবাগ সমস্যার জন্য বেশিরভাগ সময় গ্রহণকারী আপনি মুখোমুখি হতে পারেন। বেশ কয়েক বছর ধরে অনুশীলনে তারা কার্যকরভাবে আমি প্রতিস্থাপন করেছি এমন প্রতিটি দল থেকে বাগের ঝকঝকে ক্লাসকে মুছে ফেলেছে।
উপরোক্ত প্রয়োগ করার জন্যও অনেকগুলি উপায় রয়েছে - আমি কেবল লোককে কোনও পয়েন্টার মুছে ফেলার জন্য জোর করে বলার ধারণাটি চিত্রিত করার চেষ্টা করছি, কলিংারের পয়েন্টারটি মেলেনি এমন স্মৃতি প্রকাশের জন্য তাদের কোনও উপায় সরবরাহ করার পরিবর্তে ।
অবশ্যই, উপরের উদাহরণটি একটি অটো-পয়েন্টারের দিকে মাত্র এক ধাপ। যা আমি প্রস্তাব দিইনি কারণ ওপি বিশেষত একটি অটো পয়েন্টার ব্যবহার না করার ক্ষেত্রে জিজ্ঞাসা করেছিল।
delete
নাল পয়েন্টারের কাছে নিরাপদ , যদিও পয়েন্টার শূন্য করা ভাল কারণ হতে পারে এটি একটি কারণ।