সি ++ 0 এক্স-এ নালপ্ট্রার মুছে ফেলা কি এখনও নিরাপদ?


85

ইন c++03এটা কোনো প্রভাব নেই যে একটি নাল পয়েন্টার মোছার চমত্কার স্পষ্ট। প্রকৃতপক্ষে, এতে স্পষ্টভাবে বলা হয়েছে §5.3.5/2:

যে কোনও বিকল্পে, মুছার অপারেন্ডের মান যদি নাল পয়েন্টার হয় তবে ক্রিয়াকলাপের কোনও প্রভাব নেই।

তবে এই খণ্ডটির জন্য বর্তমান খসড়াটিc++0x অনুপস্থিত বলে মনে হচ্ছে। খসড়াটির বাকী অংশে আমি কেবল বাক্যগুলি খুঁজে পেতাম যেখানে মুছে ফেলুন-এক্সপ্রেশনটির অপারেন্ড নাল পয়েন্টার ধ্রুবক না হলে কী ঘটে ating নাল পয়েন্টার মুছে ফেলা এখনও সংজ্ঞায়িত করা হয় c++0x, এবং যদি তাই হয়, কোথায়?

মন্তব্য:

এটি এখনও ভালভাবে সংজ্ঞায়িত করা হয়েছে এমন পরামর্শ দেওয়ার জন্য উল্লেখযোগ্য পরিস্থিতিগত প্রমাণ রয়েছে।

প্রথমত, এখানে §5.3.5/2উল্লেখ করে দুটি বাক্য রয়েছে

প্রথম বিকল্পে (মুছে ফেলুন অবজেক্ট), অপসারণের অপারেন্ডের মান একটি নাল পয়েন্টার মান হতে পারে, ...

এবং

দ্বিতীয় বিকল্পে (অ্যারে মুছুন) মুছতে অপারেন্ডের মান একটি নাল পয়েন্টার মান বা ...

এগুলি বলে যে অপারেন্ডটি নাল হতে দেওয়া হয়, তবে তাদের নিজের থেকে আসলে কী হয় তা নির্ধারণ করে না।

দ্বিতীয়ত, এর অর্থ পরিবর্তন delete 0করা একটি বড় ব্রেকিং পরিবর্তন, এবং মান কমিটি খুব সম্ভবত এই বিশেষ পরিবর্তন করতে পারে। তদুপরি c++0xখসড়াটির সামঞ্জস্যতা এনেক্স (আনেক্সেক্স সি) এর এটি একটি ব্রেকিং পরিবর্তন বলে উল্লেখ নেই । আনেক্সেক্স সি অবশ্য একটি তথ্যবহুল বিভাগ, সুতরাং এটির মানটির কোনও ব্যাখ্যা নেই।

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

উত্তর:


102

5.3.5 / 7 বলেছেন:

যদি মুছা-প্রকাশের অপারেন্ডের মান কোনও নাল পয়েন্টার মান না হয়, তবে মুছুন-প্রকাশটি একটি বিলম্ব ফাংশন (3.7.4.2) কল করবে। অন্যথায়, deallocation ফাংশন বলা হবে কিনা তা অনির্দিষ্ট।

এবং 3.7.4.2/3 বলেছেন:

একটি ডিওলোকেশন ফাংশনে সরবরাহ করা প্রথম আর্গুমেন্টের মান একটি নাল পয়েন্টার মান হতে পারে; যদি তাই হয়, এবং যদি মানহীন ফাংশনটি স্ট্যান্ডার্ড লাইব্রেরিতে সরবরাহ করা হয় তবে কলটির কোনও প্রভাব নেই।

সুতরাং আচরণটি যথাযথভাবে সংজ্ঞায়িত করা হয়, যতক্ষণ না স্ট্যান্ডার্ড ডিএলোকেশন ফাংশন ব্যবহৃত হয়, বা কোনও ব্যবহারকারী দ্বারা সরবরাহিত ডিএলোকেশন ফাংশন নাল পয়েন্টারগুলি সঠিকভাবে পরিচালনা করে।


9
যেহেতু সি ++ 14 "যদি অভিব্যক্তিটি নাল পয়েন্টার মানকে মূল্যায়ণ করে তবে কোনও ডেস্ট্রাক্টর ডাকা হয় না, এবং ডিওলোকেশন ফাংশন বলা হয় না।"
Wormer

4
@ ওয়ার্মার আমি যে পৃষ্ঠাটি সঠিক বলে মনে করি না। সি ++ 14 স্ট্যান্ডার্ড এখনও বলেছে যে "পয়েন্টারটি শূন্য হলে (5.3.5 / 7) ডেলিওকেশন ফাংশন বলা হবে কিনা" এটি অনির্দিষ্ট।
ইন্টারজয়

4
একটি সরাইয়া হিসাবে, এটা না () একটি নাল ফাইল পয়েন্টার জন্য fclose সাথে কল নিরাপদ। উবুন্টুতে (এবং সম্ভবত অন্যান্য অপারেটিং সিস্টেমে), fclose (NULL) একটি সেগমেন্টেশন ত্রুটির কারণ হয়ে থাকে।
গেরি বিউয়ারগার্ড

7

অন্যদিকে, নাল পয়েন্টারটি মুছে ফেলার কোনও প্রভাব ফেলতে হবে না এই বিষয়টি অতিরিক্ত রান-টাইম চেককে বোঝায়।

নতুন শব্দটি শূন্য পয়েন্টারের জন্য রান-টাইম চেকটি সরিয়ে দেয় না। অন্য উপায়ে: খসড়া স্ট্যান্ডার্ড আরও বলার অপেক্ষা রাখে যে একটি বাস্তবায়ন অবশ্যই মেনে চলার জন্য নাল পয়েন্টার পরীক্ষা করা উচিত।

এছাড়াও লক্ষণীয়: পুরাতন স্ট্যান্ডার্ড নিজেই এর বিরোধিতা করেছে যে এটি বলেছে (5.3.5 / 2) যে "মুছার অপারেন্ডের মান যদি নাল পয়েন্টার হয় তবে অপারেশনটির কোনও প্রভাব নেই" তবে পরে বলেছিলেন (5.3.5 / 7) "মুছে ফেলুন-এক্সপ্রেশন একটি deallocation ফাংশন কল করবে।" একটি ফাংশন কল একটি প্রভাব। এটি বিশেষত তাই যেহেতু ডাকা ফাংশনটি সম্ভবত একটি ওভাররাইড হতে পারে operator delete

নতুন শব্দটি সেই দ্বন্দ্বকে সরিয়ে দেয়, স্পষ্টভাবে এটিকে বাস্তবায়নের দিকে ছেড়ে দেয় নাল পয়েন্টার মোছার ক্ষেত্রে ডিলোকেশন ফাংশনটি বলা হয় কিনা।

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