উত্তরটি আপনার দৃষ্টিভঙ্গির উপর নির্ভর করে:
আপনি যদি সি ++ স্ট্যান্ডার্ড দ্বারা বিচার করেন তবে আপনি নাল রেফারেন্স পাবেন না কারণ আপনি প্রথমে অপরিজ্ঞাত আচরণ পান। অপরিবর্তিত আচরণের প্রথম ঘটনাটির পরে, মানটি কিছু হতে দেয়। সুতরাং, আপনি যদি লিখেন তবে *(int*)0
একটি ভাষা স্ট্যান্ডার্ড দৃষ্টিকোণ থেকে নাল পয়েন্টারটিকে ডিফারেন্স করে আপনার মতো ইতিমধ্যে অপরিবর্তিত আচরণ রয়েছে। প্রোগ্রামটির বাকী অংশগুলি অপ্রাসঙ্গিক, একবার এই অভিব্যক্তিটি কার্যকর হয়ে গেলে আপনি খেলা থেকে বাইরে চলে যান।
তবে, বাস্তবে, নাল রেফারেন্সগুলি নাল পয়েন্টারগুলি থেকে সহজেই তৈরি করা যেতে পারে এবং আপনি নাল রেফারেন্সের পিছনে মানটি অ্যাক্সেস না করা পর্যন্ত আপনি লক্ষ্য করবেন না। আপনার উদাহরণটি কিছুটা সহজ হতে পারে, যেহেতু কোনও ভাল অপ্টিমাইজ করা সংকলক অপরিজ্ঞাত আচরণ দেখতে পাবে এবং তার উপর নির্ভরশীল যে কোনও কিছুকে কেবল অপ্টিমাইজ করবে (নাল রেফারেন্স এমনকি তৈরি করা হবে না, এটি অপ্টিমাইজড হবে)।
তবুও, অপ্টিমাইজ করা অপরিজ্ঞাত আচরণটি প্রমাণ করতে সংকলকটির উপর নির্ভর করে, যা করা সম্ভব নয়। একটি ফাইলের মধ্যে এই সাধারণ ফাংশন বিবেচনা করুন converter.cpp
:
int& toReference(int* pointer) {
return *pointer;
}
সংকলকটি যখন এই ফাংশনটি দেখবে, তখন এটি জানে না যে পয়েন্টারটি নাল পয়েন্টার কিনা। সুতরাং এটি কেবল কোড উত্পন্ন করে যা কোনও পয়েন্টারকে সংশ্লিষ্ট রেফারেন্সে পরিণত করে। (বিটিডব্লিউ: এটি একটি নোট, যেহেতু পয়েন্টার এবং রেফারেন্সগুলি হ'ল সমাবেশে সঠিক একই প্রাণীটি same) এখন, যদি আপনার user.cpp
কোড সহ অন্য কোনও ফাইল থাকে
#include "converter.h"
void foo() {
int& nullRef = toReference(nullptr);
cout << nullRef;
}
সংকলকটি জানে না যে toReference()
এটি উত্তীর্ণ পয়েন্টারটিকে অবজ্ঞাপূর্ণ করবে এবং ধরে নেবে যে এটি কোনও বৈধ রেফারেন্স দেয়, যা অনুশীলনে নাল রেফারেন্স হিসাবে ঘটবে। কলটি সফল হয় তবে আপনি যখন রেফারেন্সটি ব্যবহার করার চেষ্টা করবেন তখন প্রোগ্রামটি ক্র্যাশ হয়ে যায়। আশা করি। মানটি গোলাপী হাতির উপস্থিতিসহ কিছু ঘটতে দেয়।
আপনি এটি জিজ্ঞাসা করতে পারেন কেন এটি প্রাসঙ্গিক, সর্বোপরি, অনির্ধারিত আচরণটি ইতিমধ্যে ভিতরে ভিতরে ট্রিগার হয়েছিল toReference()
। উত্তরটি ডিবাগ করা হচ্ছে: নাল উল্লেখগুলি নাল পয়েন্টারগুলির মতোই প্রচার ও প্রসারণ করতে পারে। যদি আপনি সচেতন না হন যে নাল উল্লেখ পাওয়া যায়, এবং সেগুলি তৈরি করা এড়াতে শিখেন, তবে আপনি যখন কেবল কোনও সাধারণ পুরানো int
সদস্যটি পড়ার চেষ্টা করছেন তখন আপনার সদস্য ফাংশনটি ক্র্যাশ হওয়ার কারণ বলে মনে করার চেষ্টা করতে আপনি বেশ কিছুটা সময় ব্যয় করতে পারেন (উত্তর: উদাহরণ সদস্যের আহ্বানে একটি নাল রেফারেন্স ছিল, this
একইভাবে নাল পয়েন্টার, এবং আপনার সদস্য ঠিকানা 8 হিসাবে চিহ্নিত বলে গণনা করা হয়েছে)।
তাহলে নাল রেফারেন্সের জন্য কীভাবে পরীক্ষা করা যায়? আপনি লাইন দিয়েছেন
if( & nullReference == 0 )
আপনার প্রশ্নে ভাল, এটি কাজ করবে না: স্ট্যান্ডার্ড অনুসারে, আপনি যদি নাল পয়েন্টারকে অবজ্ঞা করে থাকেন এবং আপনার কোনও নাল পয়েন্টারকে অবজ্ঞা না করে নাল রেফারেন্স তৈরি করতে পারবেন না, সুতরাং নাল রেফারেন্সগুলি কেবল অপরিজ্ঞাত আচরণের ক্ষেত্রের ভিতরেই বিদ্যমান exist যেহেতু আপনার সংকলকটি ধরে নিতে পারে যে আপনি অপরিজ্ঞাত আচরণটি ট্রিগার করছেন না, এটি ধরে নিতে পারে যে নাল রেফারেন্সের মতো কোনও জিনিস নেই (যদিও এটি সহজেই কোড নির্গত করবে যা নাল রেফারেন্স উত্পন্ন করবে!)। যেমনটি এটি if()
শর্তটি দেখেছে , উপসংহারে পৌঁছেছে যে এটি সত্য হতে পারে না, এবং কেবল পুরো if()
বিবৃতিটি ফেলে দেয় । লিংক সময় অপ্টিমাইজেশনের প্রবর্তনের সাথে, শক্তিশালী উপায়ে নাল রেফারেন্সগুলি পরীক্ষা করা সহজ অসম্ভব হয়ে পড়েছে।
টিএল; ডিআর:
নাল রেফারেন্সগুলি কিছুটা ভয়াবহ অস্তিত্ব:
তাদের অস্তিত্ব অসম্ভব বলে মনে হচ্ছে (= মান অনুসারে)
তবে এগুলি বিদ্যমান (= উত্পন্ন মেশিন কোডের সাহায্যে),
তবে তারা উপস্থিত থাকলে আপনি তাদের দেখতে পাবেন না (= আপনার চেষ্টাগুলি অপ্টিমাইজড হবে)
তবে তারা আপনাকে অজান্তেই হত্যা করতে পারে (= আপনার প্রোগ্রামটি অদ্ভুত পয়েন্টগুলিতে ক্রাশ হয় বা আরও খারাপ)।
আপনার একমাত্র আশা হ'ল তাদের অস্তিত্ব নেই (= আপনার প্রোগ্রামটি তৈরি না করে লিখুন)।
আমি আশা করি যে আপনাকে ঘৃণা করতে আসবে না!