মুছে ফেলা পয়েন্টারটি দিয়ে ভিজ্যুয়াল স্টুডিও কী করবে এবং কেন?


130

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

ভিজ্যুয়াল স্টুডিও 2012 তে; ব্যাপারটা মনে হয় না!

উদাহরণ:

#include <iostream>

using namespace std;

int main()
{
    int* ptr = new int;
    cout << "ptr = " << ptr << endl;
    delete ptr;
    cout << "ptr = " << ptr << endl;

    system("pause");

    return 0;
}

আমি যখন এই প্রোগ্রামটি সংকলন এবং চালনা করি তখন আমি নিম্নলিখিত আউটপুটটি পাই:

ptr = 0050BC10
ptr = 00008123
Press any key to continue....

পরিষ্কারভাবে মুছে ফেলা হবে এমন ঠিকানাটি পরিবর্তনের দিকে ইঙ্গিত করছে!

এটি কেন ঘটছে? বিশেষত ভিজ্যুয়াল স্টুডিওর সাথে এর কিছু যুক্ত রয়েছে?

এবং যদি মুছুন এটি যেভাবেই দেখানো হচ্ছে ঠিকানাটি পরিবর্তন করতে পারে, তবে কেন NULLকিছু এলোমেলো ঠিকানার পরিবর্তে পয়েন্টারটিকে স্বয়ংক্রিয়ভাবে সেট করে মুছবেন না ?


4
একটি পয়েন্টার মুছুন, এর অর্থ এটি নূলে সেট করা হবে না, আপনাকে এটি যত্ন নিতে হবে।
ম্যাট

11
আমি এটি জানি, তবে আমি যে বইটি বিশেষভাবে পড়ছি তা বলছে যে এটি মুছে ফেলার আগে এটি একই ঠিকানায় ইঙ্গিত করেছিল, তবে সেই ঠিকানার বিষয়বস্তু ওভাররাইট করা যেতে পারে।
tjwrona1992

6
@ tjwrona1992, হ্যাঁ, কারণ সাধারণত এটি ঘটে চলেছে। বইটিতে সর্বাধিক সম্ভাব্য ফলাফলগুলির তালিকা দেওয়া হয়েছে, কঠোর নিয়ম নয়।
সের্গেইএ

5
@ tjwrona1992 একটি সি ++ বই পড়ছি - এবং বইটির নাম ...?
পলম্যাক কেনজি

4
@ tjwrona1992: এটি অবাক করে দিতে পারে, তবে এটি অবৈধ পয়েন্টার মানটির সমস্ত ব্যবহার যা অপরিজ্ঞাত আচরণ, কেবলমাত্র ডিফারেন্সিং নয়। "এটি কোন দিকে ইশারা করছে" তা পরীক্ষা করা হচ্ছে "অস্বীকৃত উপায়ে মান ব্যবহার করে আইএস।
বেন ভয়েগট

উত্তর:


175

আমি লক্ষ্য করেছি যে সঞ্চিত ঠিকানাটি ptrসর্বদা এর সাথে ওভাররাইট করা হচ্ছে 00008123...

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

... NULL এর জন্য চেকগুলি একটি সাধারণ কোড কনস্ট্রাক্ট যার অর্থ একটি স্যানিটাইজেশন মান হিসাবে NULL ব্যবহারের সাথে NULL এর বিদ্যমান চেকটি এক জেনুইন মেমরির সুরক্ষা ইস্যুটি যথাযথভাবে লুকিয়ে রাখতে পারে যার মূল কারণটি সত্যই সম্বোধনের প্রয়োজন।

এই কারণে আমরা 0x8123 কে স্যানিটাইজেশন মান হিসাবে বেছে নিয়েছি - অপারেটিং সিস্টেমের দৃষ্টিকোণ থেকে এটি শূন্য ঠিকানা (NULL) হিসাবে একই মেমরি পৃষ্ঠায় রয়েছে তবে 0x8123 এ অ্যাক্সেস লঙ্ঘনটি বিকাশকারীকে আরও বিশদ মনোযোগের প্রয়োজন হিসাবে আরও ভালভাবে দাঁড়াবে detailed ।

এটি মুছে ফেলার পরে ভিজ্যুয়াল স্টুডিও পয়েন্টারটির সাথে কী করে তা কেবল এটিই ব্যাখ্যা করে না, তারা কেন এটি NULLস্বয়ংক্রিয়ভাবে সেট না করা বেছে নিয়েছে তাও উত্তর দেয় !


এই "বৈশিষ্ট্য "টি" এসডিএল চেকস "সেটিংসের অংশ হিসাবে সক্ষম হয়েছে। এটি সক্ষম / অক্ষম করতে এখানে যান: প্রকল্প -> বৈশিষ্ট্য -> কনফিগারেশন বৈশিষ্ট্য -> সি / সি ++ -> সাধারণ -> এসডিএল চেক

এটি নিশ্চিত করতে:

এই সেটিংটি পরিবর্তন করা এবং একই কোডটি পুনরায় চালু করা নিম্নলিখিত আউটপুট উত্পাদন করে:

ptr = 007CBC10
ptr = 007CBC10

"বৈশিষ্ট্য" শুধুমাত্র sanitize মুছে ফেলবে কলিং, কারণ একটি ক্ষেত্রে কোট যেখানে আপনি একই অবস্থানে দুই পয়েন্টার আছে হয় এক তাদের। অন্যটি অবৈধ অবস্থানের দিকে ইশারা করে রেখে যাবে ...


হালনাগাদ:

আরও 5 বছরের সি ++ প্রোগ্রামিংয়ের অভিজ্ঞতার পরে আমি বুঝতে পারি যে পুরো বিষয়টিটি মূলত একটি মূল বিষয়। আপনি যদি একজন সি ++ প্রোগ্রামার হন এবং এখনও স্মার্ট পয়েন্টার ব্যবহার না করে কাঁচা পয়েন্টারগুলি ব্যবহার করছেন newএবং deleteপরিচালনা করছেন (যা এই পুরো সমস্যাটি উদ্ঘাটন করে) আপনি সি প্রোগ্রামার হওয়ার জন্য ক্যারিয়ারের পথে পরিবর্তনের বিষয়টি বিবেচনা করতে পারেন। ;)


12
এটি একটি দুর্দান্ত সন্ধান। আমি আশা করি এমএস এর থেকে ভাল ডিবাগিং আচরণের আরও ভাল করে দস্তাবেজ করতে পারে। উদাহরণস্বরূপ, কোন সংকলক সংস্করণ এটি প্রয়োগ করতে শুরু করেছে এবং কোন বিকল্পগুলি আচরণকে সক্ষম / অক্ষম করে তা জেনে ভাল লাগবে।
মাইকেল বুড় 17

5
"অপারেটিং সিস্টেমের দৃষ্টিকোণ থেকে এটি শূন্য ঠিকানার মতো একই মেমরি পৃষ্ঠায়" - হু? X86 এ স্ট্যান্ডার্ড (বড় পৃষ্ঠাগুলি উপেক্ষা করে) পৃষ্ঠা আকারটি কি এখনও উইন্ডোজ এবং লিনাক্স উভয়ের জন্য 4kb নয়? যদিও আমি রেমন্ড চেনের ব্লগে অ্যাড্রেস স্পেসের প্রথম 64 কিলোবাইটের কিছু স্মরণে রেখেছি, তাই বাস্তবে আমি এটি একই ফল পেয়েছি
ভু

12
@ ভো উইন্ডোজগুলি প্রথম (এবং শেষ) 64 কেবি মূল্যের র‌্যাম আটকে রাখার জন্য মৃত জায়গা হিসাবে সংরক্ষণ করে। 0x8123 সেখানে সুন্দরভাবে পড়ে
freak

7
প্রকৃতপক্ষে, এটি খারাপ অভ্যাসকে উত্সাহ দেয় না এবং এটি আপনাকে নুলকে পয়েন্টার নির্ধারণ এড়ানোর অনুমতি দেয় না - পুরো কারণটি তারা 0x8123পরিবর্তে ব্যবহার করছে 0। পয়েন্টারটি এখনও অবৈধ, তবে এটি (ভাল) অবৈধ করার চেষ্টা করার সময় একটি ব্যতিক্রম ঘটায় এবং এটি নুল চেকগুলি পাস করে না (ভালও, কারণ এটি না করার ক্ষেত্রে এটি একটি ত্রুটি)। খারাপ অভ্যাসের জায়গা কোথায়? এটি সত্যই এমন কিছু যা আপনাকে ডিবাগ করতে সহায়তা করে।
লুয়ান

3
ভাল, এটি উভয় (সমস্ত) সেট করতে পারে না, সুতরাং এটি দ্বিতীয় সেরা বিকল্প। আপনি যদি এটি পছন্দ করেন না, কেবল এসডিএল চেকগুলি বন্ধ করুন - আমি এগুলি বরং দরকারী মনে করি, বিশেষত যখন অন্য কারোর কোডটি ডিবাগ করার সময়।
লুয়ান

30

আপনি /sdlসংকলন বিকল্পের পার্শ্ব প্রতিক্রিয়া দেখতে পাবেন । ভিএস ২০১৫ প্রকল্পের জন্য ডিফল্টরূপে চালু করা হয়েছে, এটি / জিএস সরবরাহ করে এর বাইরে অতিরিক্ত সুরক্ষা চেক সক্ষম করে। প্রকল্প> বৈশিষ্ট্য> সি / সি ++> সাধারণ> এসডিএল এটিকে পরিবর্তন করতে সেটিংস পরীক্ষা করে।

এমএসডিএন নিবন্ধ থেকে উদ্ধৃতি :

  • সীমিত পয়েন্টার স্যানিটাইজেশন সম্পাদন করে। অভিব্যক্তিগুলিতে যা ডিरेফারেন্সগুলিতে জড়িত না এবং প্রকারভেদে কোনও ব্যবহারকারী-নির্ধারিত ডেস্ট্রাক্টর নেই, পয়েন্টার রেফারেন্সগুলি মুছার জন্য একটি কল করার পরে একটি অ-বৈধ ঠিকানায় সেট করা হয়। এটি বাসি পয়েন্টার রেফারেন্সগুলির পুনরায় ব্যবহার রোধ করতে সহায়তা করে।

মনে রাখবেন না যে আপনি যখন এমএসভিসি ব্যবহার করেন তখন মুছে ফেলা পয়েন্টারগুলি NUL এ সেট করা একটি খারাপ অভ্যাস। এটি আপনাকে ডিবাগ হিপ এবং এই / এসডিএল বিকল্প উভয়ই থেকে পাওয়া সহায়তাকে হারাতে পারে, আপনি আর আপনার প্রোগ্রামে অবৈধ ফ্রি / ডিলিট কলগুলি সনাক্ত করতে পারবেন না।


1
নিশ্চিত করেছে। এই বৈশিষ্ট্যটি অক্ষম করার পরে, পয়েন্টারটি আর পুনঃনির্দেশিত হয় না। প্রকৃত সেটিংস যা এটি সংশোধন করে তা সরবরাহ করার জন্য ধন্যবাদ!
tjwrona1992

হান্স, আপনার একই জায়গায় দু'টি পয়েন্টার রয়েছে এমন ক্ষেত্রে নুআলএল-তে মুছে ফেলা পয়েন্টার সেট করা এখনও খারাপ অভ্যাস হিসাবে বিবেচিত হয়? আপনি যখন deleteএকজন, ভিজ্যুয়াল স্টুডিও দ্বিতীয় পয়েন্টারটিকে তার আসল অবস্থানটির দিকে নির্দেশ করবে যা এখন অবৈধ।
tjwrona1992

1
আপনি কী ধরণের যাদু করবেন বলে আশা করছেন তা আমার কাছে খুব অস্পষ্ট N এই অন্যান্য পয়েন্টারটি তাই এটি কোনওরকম সমাধান করে না, তবুও ত্রুটিটি খুঁজে পেতে আপনার ডিবাগ বরাদ্দ প্রয়োজন।
হ্যানস প্যাস্যান্ট

3
ভিএস পয়েন্টারগুলি পরিষ্কার করে না । এটি তাদের দূষিত করে। সুতরাং আপনার প্রোগ্রামটি ক্র্যাশ হয়ে যাবে যখন আপনি সেগুলি ব্যবহার করুন। ডিবাগ বরাদ্দকারী হ্যাপ মেমরির সাথে একই জিনিসটি করে। NULL নিয়ে বড় সমস্যা, এটি যথেষ্ট দুর্নীতিগ্রস্থ নয়। অন্যথায় একটি সাধারণ কৌশল, গুগল "0xdeadbeef"।
হ্যানস প্যাস্যান্ট

1
পয়েন্টারটিকে NULL এ সেট করা তার আগের ঠিকানার দিকে ইঙ্গিত করে রেখে দেওয়া থেকে এখন আরও ভাল যা এখন অবৈধ। কোনও NUL পয়েন্টারে লেখার চেষ্টা করা কোনও ডেটা দূষিত করবে না এবং সম্ভবত প্রোগ্রামটি ক্রাশ করবে। সেই সময়ে পয়েন্টারটি পুনরায় ব্যবহারের চেষ্টা করা প্রোগ্রামটি ক্র্যাশও না করে, এটি কেবল খুব অনাকাঙ্ক্ষিত ফলাফল আনতে পারে!
tjwrona1992

19

এটি আরও উল্লেখ করে যে পয়েন্টারটি একই স্থানে নির্দেশ দেওয়া অবিরত করবে যতক্ষণ না এটি পুনরায় সাইন করা হয় বা NULL এ সেট না করা হয়।

এটি অবশ্যই বিভ্রান্তিকর তথ্য।

পরিষ্কারভাবে মুছে ফেলা হবে এমন ঠিকানাটি পরিবর্তনের দিকে ইঙ্গিত করছে!

এটি কেন ঘটছে? বিশেষত ভিজ্যুয়াল স্টুডিওর সাথে এর কিছু যুক্ত রয়েছে?

এটি স্পষ্টভাবে ভাষা নির্দিষ্টকরণের মধ্যে রয়েছে। ptrকল করার পরে বৈধ নয় delete। এর ptrপরে deleteডি ব্যবহার করা অপরিজ্ঞাত আচরণের কারণ। এটা করবেন না। রানটাইম পরিবেশটি ptrকল করার পরে যা কিছু করতে চায় তা করতে মুক্ত delete

এবং যদি মুছুন এটি যেভাবেই ইঙ্গিত করছে ঠিকানাটি পরিবর্তন করতে পারে, তবে কেন কিছু র্যান্ডম ঠিকানার পরিবর্তে স্বয়ংক্রিয়ভাবে পয়েন্টারটিকে NULL এ সেট করবে না ???

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


1
আমি বিশ্বাস করি না যে এটি ওপির প্রশ্নের উত্তর দেয়।
সের্গেইএ

সম্পাদনার পরেও অসমত। এটিকে NULL এ স্থাপন করা সমস্যাটি আড়াল করবে না - আসলে, এটি ছাড়া এটি আরও বেশি ক্ষেত্রে এটি এক্সপোজ করবে। সাধারণ বাস্তবায়নগুলি এটি না করার একটি কারণ রয়েছে এবং কারণটি আলাদা।
সের্গেইএ

4
@ সের্গেইএ, বেশিরভাগ বাস্তবায়ন দক্ষতার জন্য এটি করে না। যাইহোক, যদি কোনও বাস্তবায়ন সেট করার সিদ্ধান্ত নেয় তবে এটিকে এমন কিছুতে সেট করা ভাল যা শূন্য নয়। এটি সমস্যাগুলি NUL এ সেট করা থাকলে যত তাড়াতাড়ি সম্ভব প্রকাশ করবে। এটি NULL এ সেট করা হয়েছে, deleteপয়েন্টারে দুবার কল করা কোনও সমস্যা সৃষ্টি করবে না। এটা অবশ্যই ভাল না।
আর সাহু

না, দক্ষতা নয় - অন্তত, এটি প্রাথমিক উদ্বেগ নয়।
সের্গেইএ

7
@ সের্গেইএ এমন একটি মানের জন্য একটি পয়েন্টার সেট করা NULLযা প্রক্রিয়াটির ঠিকানার বাইরে নয়, তবে দুটি বিকল্পের চেয়ে বেশি কেস প্রকাশ করবে। এটিকে ঝুঁকিপূর্ণভাবে ছেড়ে দেওয়া অগত্যা কোনও সেগফাল্টের কারণ এটি মুক্ত হওয়ার পরে ব্যবহার করা হবে না; এটিকে সেট করে NULLরাখলে এটি deleteআবার হয়ে থাকলে সেগফল্টের কারণ হবে না ।
ব্ল্যাকলাইট জ্বলজ্বলে

10
delete ptr;
cout << "ptr = " << ptr << endl;

সাধারণভাবে এমনকি পড়া (যেমন আপনি উপরে করেন, নোট: এটি ডিফেরেন্সিং থেকে পৃথক) অবৈধ পয়েন্টারগুলির মানগুলি (পয়েন্টারটি যখন আপনি deleteএটি করেন তখন এটি অবৈধ হয়ে যায় ) যখন এটি বাস্তবায়িত সংজ্ঞায়িত আচরণ হয়। এই চালু হয় ফিটনেসে # 1438এখানেও দেখুন ।

অনুগ্রহ করে নোট করুন যে এর আগে অবৈধ পয়েন্টারগুলির পাঠ্য মূল্যগুলি সংজ্ঞায়িত আচরণ ছিল, সুতরাং আপনার উপরে যা আছে তা হবে অপরিজ্ঞাত আচরণ, যার অর্থ কিছু হতে পারে।


3
প্রাসঙ্গিক থেকে উদ্ধৃতিটিও প্রাসঙ্গিক [basic.stc.dynamic.deallocation]: "স্ট্যান্ডার্ড লাইব্রেরিতে একটি ডিওলোকেশন ফাংশনকে দেওয়া যুক্তি যদি একটি পয়েন্টার হয় যা নাল পয়েন্টার মান নয় তবে ডিএলোকেশন ফাংশনটি পয়েন্টার দ্বারা রেফারেন্সকৃত স্টোরেজটিকে বাতিল করে দেবে, কোনও পয়েন্টারকে উল্লেখ করে অবৈধভাবে সমস্ত পয়েন্টার উপস্থাপন করবে বিলম্বিত স্টোরেজের অংশ "এবং [conv.lval](বিভাগ ৪.১) এর নিয়মে যে কোনও অবৈধ পয়েন্টার মান পড়ার বিষয়টি প্রয়োগ-সংজ্ঞায়িত আচরণ says
বেন ভয়েগট

এমনকি ইউবি কোনও নির্দিষ্ট বিক্রেতার দ্বারা একটি নির্দিষ্ট উপায়ে প্রয়োগ করা যেতে পারে যেমন এটি নির্ভরযোগ্য, কমপক্ষে সেই সংকলকের জন্য। মাইক্রোসফ্ট যদি সিডব্লিউজি # 1438 এর আগে তাদের পয়েন্টার-স্যানিটাইজেশন বৈশিষ্ট্যটি বাস্তবায়নের সিদ্ধান্ত নিয়েছে, তবে সেই বৈশিষ্ট্যটি আরও কম বা নির্ভরযোগ্য করে তুলতে পারত না, এবং বিশেষত এটি বৈশিষ্ট্যটি চালু করা হলে "কিছুই হতে পারে" এমনটি সত্য নয় simply মান নির্বিশেষে যাই বলুক না কেন।
কাইল স্ট্র্যান্ড

@ কাইলস্ট্র্যান্ড: আমি মূলত ইউবির সংজ্ঞা দিয়েছিলাম ( blog.regehr.org/archives/213 )।
জিওরজিম

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

1

আমি বিশ্বাস করি, আপনি কোনও ধরণের ডিবাগ মোড চালাচ্ছেন এবং ভিএস আপনার পয়েন্টারটিকে কিছু পরিচিত স্থানে ফিরিয়ে আনার চেষ্টা করছেন, যাতে আরও ডিফেরেন্স করার চেষ্টা এটি সনাক্ত করে এবং প্রতিবেদন করতে পারে। রিলিজ মোডে একই প্রোগ্রামটি সংকলন / চালানোর চেষ্টা করুন।

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

প্রকৃতপক্ষে, আমি এটির সম্পর্কে যত বেশি চিন্তা করি, ততই আমি দেখতে পাচ্ছি যে যথারীতি এটি করার সময় ভিএস ভুল হয় is যদি পয়েন্টারটি কনস্টেন্ট হয়? এটি কি এখনও এটি পরিবর্তন করতে চলেছে?


হ্যাঁ, এমনকি ধ্রুবক পয়েন্টারগুলি এই রহস্যময় 8123 এ পুনঃনির্দেশিত হয়!
tjwrona1992

ভিএস-তে আরও একটি পাথর রয়েছে :) ঠিক আজ সকালেই কেউ জিজ্ঞাসা করলেন কেন তাদের ভিএসের পরিবর্তে জি ++ ব্যবহার করা উচিত should এখানে এটা যায়.
সের্গেইএ

7
@ সের্গেইএ তবে অপর পক্ষ থেকে মুছে ফেলা পয়েন্টারটি আপনাকে সেগফল্টের মাধ্যমে দেখিয়ে দেবে যে আপনি একটি মোছা পয়েন্টারকে ডিফ করার চেষ্টা করেছেন এবং এটি NULL এর সমান হবে না। অন্য ক্ষেত্রে এটি কেবল ক্র্যাশ করবে যদি পৃষ্ঠাটিও মুক্তি পায় (যা খুব সম্ভাবনা নয়)। দ্রুত ব্যর্থ; তাড়াতাড়ি সমাধান করুন।
ratchet freak

1
@ratchetfreak "দ্রুত ব্যর্থ হবেন, তাড়াতাড়ি সমাধান করুন" একটি খুব মূল্যবান মন্ত্র, তবে "কী ফরেনসিক প্রমাণ নষ্ট করে দ্রুত ব্যর্থ হওয়া" এই জাতীয় মূল্যবান মন্ত্রটি শুরু করে না। সাধারণ ক্ষেত্রে এটি সুবিধাজনক হতে পারে তবে আরও জটিল ক্ষেত্রে (আমাদের যাদের সবচেয়ে বেশি সাহায্যের দরকার হয়), মূল্যবান তথ্য মুছে ফেলা সমস্যা সমাধানের জন্য উপলব্ধ আমার সরঞ্জামগুলিকে হ্রাস করে।
আম্মন কর্ট

2
@ tjwrona1992: মাইক্রোসফ্ট আমার মতে এখানে সঠিক জিনিস করছে। কোনও কিছুই না করার চেয়ে একটি পয়েন্টারকে স্যানিটাইজ করা ভাল। এবং যদি এটি আপনাকে ডিবাগ করতে সমস্যা সৃষ্টি করে, খারাপ মুছুন কলের আগে ব্রেক পয়েন্ট রাখুন। অদ্ভুততা হ'ল এই জাতীয় কিছু ছাড়াই আপনি কখনই সমস্যাটি চিহ্নিত করবেন না। এবং যদি এই বাগগুলি সনাক্ত করার জন্য আপনার আরও ভাল সমাধান থাকে, তবে এটি ব্যবহার করুন এবং মাইক্রোসফ্ট কী করে আপনি কেন যত্নশীল হন?
Zan Lynx

0

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

আরেকটি বিষয় হ'ল, কিছু রান টাইম অপ্টিমাইজার সেই মানটি পরীক্ষা করতে পারে এবং এর ফলাফলগুলি পরিবর্তন করতে পারে।

পূর্ববর্তী সময়ে এমএস মান সেট করে 0xcfffffff

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