মেমরি-অব্যবহৃত প্রোগ্রামিংয়ের জটিলতাগুলি কী কী?


24

বা অন্য কথায়, স্বয়ংক্রিয় আবর্জনা সংগ্রহ কোন নির্দিষ্ট সমস্যাগুলি সমাধান করেছে? আমি কখনই নিম্ন-স্তরের প্রোগ্রামিং করিনি, তাই আমি জানি না কীভাবে নিখরচায় সংস্থানগুলি জটিল হতে পারে।

জিসি ঠিকানার যে ধরণের বাগগুলি দেখে মনে হয় (কমপক্ষে কোনও বাহ্যিক পর্যবেক্ষকের কাছে) এমন এক ধরণের জিনিস যা কোনও প্রোগ্রামার তার ভাষা, গ্রন্থাগার, ধারণাগুলি, আইডিয়োম ইত্যাদি ভাল জানেন না। তবে আমি ভুল হতে পারি: ম্যানুয়াল মেমোরি হ্যান্ডলিং অভ্যন্তরীণ জটিল?


3
আমাদের জানাতে কিভাবে আপনার প্রশ্নে Wikipedia নিবন্ধটি দ্বারা উত্তর না হয় প্রসারিত দয়া করে garbace সংগ্রহ এবং এর আরো নির্দিষ্টভাবে অধ্যায় তার সুফল
yannis

আর একটি সুবিধা হ'ল সুরক্ষা, যেমন বাফার ওভাররনগুলি অত্যন্ত শোষণযোগ্য এবং মেমরির (মিস) পরিচালনা থেকে অনেকগুলি সুরক্ষা দুর্বলতা দেখা দেয়।
StuperUser

7
@ স্টুপারউসার: স্মৃতির উত্সের সাথে এর কোনও যোগসূত্র নেই। আপনি জিসি থেকে ঠিকঠাক হয়ে মেমরিকে ছাড়িয়ে নিতে পারেন। জিসি ভাষাগুলি সাধারণত এটিকে আটকে দেয় তা হ'ল এবং যে ভাষাগুলি আপনি জিসি প্রযুক্তির তুলনায় ত্রিশ বছরেরও কম পিছনে থাকেন তাদের সাথে তুলনা করে বাফারকে ছাড়িয়ে যাওয়ার সুরক্ষাও দেয়।
ডেডএমজি

উত্তর:


29

আমি কখনই নিম্ন-স্তরের প্রোগ্রামিং করিনি, তাই আমি জানি না কীভাবে নিখরচায় সংস্থানগুলি জটিল হতে পারে।

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

এটি বলার পরে, এ সম্পর্কে সত্যই ভীতিজনক বা জটিল কিছু নেই। মনে রাখবেন আপনি যখন শিশু ছিলেন এবং আপনার মা যখন আপনাকে খেলনাগুলি খেলতে বাধাতে বলেছিলেন, যখন সে আপনার কাজের মেয়ে নয় এবং সে আপনার জন্য ঘরটি পরিষ্কার করতে যাচ্ছে না? মেমরি পরিচালনা কেবল কোডটিতে প্রয়োগ করা হয় একই নীতি। (জিসি একজন দাসী থাকার মতো যা আপনার পরে পরিষ্কার করবে , তবে সে খুব অলস এবং কিছুটা নিখুঁত)) এর মূলনীতিটি সহজ: আপনার কোডের প্রতিটি ভেরিয়েবলের এক এবং একমাত্র মালিক থাকে, এবং সেই মালিকের দায়িত্ব এই ভেরিয়েবলের মেমরিটি মুক্ত করার দরকার নেই যখন এটি আর প্রয়োজন হয় না। ( একক মালিকানার নীতি) এর জন্য প্রতিটি বরাদ্দের জন্য একটি কল প্রয়োজন, এবং বেশ কয়েকটি স্কিমের উপস্থিতি রয়েছে যে মালিকানা এবং ক্লিনআপ স্বয়ংক্রিয়ভাবে বা অন্য কোনও উপায়ে স্বয়ংক্রিয়ভাবে চালিত হয় যাতে আপনাকে সেই কলটি নিজের কোডটিতেও লিখতে হবে না।

আবর্জনা সংগ্রহের ফলে দুটি সমস্যার সমাধান হওয়ার কথা। এটি তাদের মধ্যে একটিতে খুব খারাপ কাজ করে এবং বাস্তবায়নের উপর নির্ভর করে অন্যটির সাথে ভাল করতে পারে বা নাও পারে। সমস্যাগুলি হ'ল মেমরি ফুটো (এটি শেষ করার পরে স্মৃতি ধরে রাখা) এবং ঝুঁকির রেফারেন্স (এটি শেষ করার আগে স্মৃতি মুক্ত করা)) দু'টি বিষয়কেই দেখে নেওয়া যাক:

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

ভাগ্যক্রমে, এই সমস্যাটি মোকাবেলা করা মূলত একটি সমস্যার সমাধান। আপনার কোনও আবর্জনা সংগ্রহকারী দরকার নেই, আপনার একটি ডিবাগিং মেমরি পরিচালক দরকার। উদাহরণস্বরূপ, আমি ডেলফি ব্যবহার করি এবং একটি একক বহিরাগত গ্রন্থাগার এবং একটি সাধারণ সংকলক নির্দেশিকা সহ আমি বরাদ্দকারীকে "সম্পূর্ণ ডিবাগ মোড" এ সেট করতে পারি। এটি ব্যবহৃত বৈশিষ্ট্যগুলি স্মরণে রাখে এমন কিছু বৈশিষ্ট্য সক্ষম করার পরিবর্তে একটি তুচ্ছ (5% এরও কম) কর্মক্ষমতা ওভারহেড যুক্ত করে। যদি আমি কোনও বস্তু মুক্ত করি তবে এটি এর স্মৃতিটি পূরণ করে0x80বাইটস (সহজেই ডিবাগারে সনাক্তকরণযোগ্য) এবং যদি আমি কোনও নিখরচায় কোনও ভার্চুয়াল পদ্ধতিতে (ডেস্ট্রাক্টর সহ) কল করার চেষ্টা করি তবে এটি তিনটি স্ট্যাক ট্রেস সহ একটি ত্রুটি বাক্স সহ প্রোগ্রামটিকে লক্ষ্য করে এবং বাধা দেয় - যখন বস্তুটি তৈরি হয়েছিল, যখন এটি মুক্ত হয়েছিল এবং আমি এখন কোথায় আছি - আরও কিছু দরকারী তথ্য, তখন একটি ব্যতিক্রম উত্থাপন করে। এটি স্পষ্টতই মুক্তির বিল্ডগুলির জন্য উপযুক্ত নয় তবে এটি ট্র্যাকিং ডাউন এবং জটলা সংক্রান্ত রেফারেন্স সম্পর্কিত সমস্যাগুলিকে তুচ্ছ করে তোলে।

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

আমি সম্ভবত জিসি প্রবক্তাদের দ্বারা ডিন্ড হয়ে যাচ্ছি যদি আমি এরকম কিছু বলার চেষ্টা করি, তবে আমাকে ব্যাখ্যা করার অনুমতি দিন। মনে রাখবেন যে যখন আপনার আর প্রয়োজন হয় না তখন মেমরি ফাঁসের সংজ্ঞা বরাদ্দ মেমরি ধরে রাখে। কোনও কিছুর কোনও রেফারেন্স না থাকা ছাড়াও, আপনি কোনও অযৌক্তিক রেফারেন্স রেখে স্মৃতি ফাঁস করতে পারেন যেমন আপনার যখন এটি ছেড়ে দেওয়া উচিত তখন কোনও ধারক বস্তুতে রাখা। এটি করার ফলে আমি কিছু মেমরি ফাঁস দেখেছি এবং আপনার জিসি আছে কিনা তা সনাক্ত করা তাদের পক্ষে খুব কঠিন, কারণ এগুলি মেমরির ক্ষেত্রে পুরোপুরি বৈধ রেফারেন্স জড়িত এবং ডিবাগিং সরঞ্জামগুলির জন্য কোনও পরিষ্কার "বাগ" নেই ক্যাচ। আমি যতদূর জানি, এমন কোনও স্বয়ংক্রিয় সরঞ্জাম নেই যা আপনাকে এই ধরণের মেমরি ফাঁস ধরতে দেয়।

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

ট্রেসিং নিয়ে দুটি সমস্যা আছে। প্রথমত, এটি ধীরে ধীরে এবং ঘটনাটি ঘটতে চলাকালীন দৌড়ের পরিস্থিতি এড়াতে প্রোগ্রামকে কমবেশি বিরতি দিতে হবে। প্রোগ্রামটি কোনও ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করার বা কোনও সার্ভার অ্যাপ্লিকেশনটিতে বোগড-ডাউন পারফরম্যান্সের কথা মনে করার পরে এটি লক্ষণীয় কার্যকর এক্সিকিউটিচ হিচাপগুলিতে ডেকে আনতে পারে। এটি বিভিন্ন কৌশল দ্বারা যেমন হ্রাস করা যেতে পারে যেমন বরাদ্দকৃত মেমোরিটিকে "প্রজন্মের" রূপে নীত করে যে আপনি যদি প্রথমবার চেষ্টা করার পরে যদি কোনও বরাদ্দ সংগ্রহ না করা হয় তবে এটি কিছু সময়ের জন্য আটকে থাকবে। .NET ফ্রেমওয়ার্ক এবং JVM উভয়ই প্রজন্মের আবর্জনা সংগ্রহকারীদের ব্যবহার করে।

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

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

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

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

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

আপনি যখন সত্যই এটি দেখুন, আবর্জনা সংগ্রহ ঝুঁকিপূর্ণ উল্লেখগুলি প্রতিরোধের সাথে ভাল করতে পারে বা না পারে এবং মেমরি ফুটো সামলাতে সর্বজনীনভাবে খারাপ কাজ করে। এর একটি পুণ্য, আসলে, আবর্জনা সংগ্রহ নিজেই নয়, তবে একটি পার্শ্ব-প্রতিক্রিয়া: এটি হিপ কমপ্যাকশন সম্পাদনের জন্য একটি স্বয়ংক্রিয় উপায় সরবরাহ করে। এটি একটি ত্রৈমাসিক সমস্যা (গাদা খণ্ডের মাধ্যমে স্মৃতিশক্তি ক্লান্তি) রোধ করতে পারে যা দীর্ঘসময় ধরে নিয়মিত চলতে থাকে এবং উচ্চ মাত্রায় মেমরি মন্থন করে এমন প্রোগ্রামগুলিকে মেরে ফেলতে পারে, এবং আবর্জনা সংগ্রহ ছাড়াই হিপ সংযোগটি বেশ অসম্ভব। যাইহোক, আজকাল কোনও ভাল মেমোরি বরাদ্দকারী টুকরো টুকরো করতে হ্রাস করতে বালতি ব্যবহার করে, যার অর্থ ফ্র্যাগমেন্টেশন কেবলমাত্র চরম পরিস্থিতিতেই সমস্যা হয়ে দাঁড়ায়। এমন একটি প্রোগ্রামের জন্য যেখানে হিপ বিভাজন সমস্যা হতে পারে, এটি ' একটি সংযোগকারী আবর্জনা সংগ্রহকারী ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। তবে অন্য কোনও ক্ষেত্রে আইএমও, আবর্জনা সংগ্রহের ব্যবহার অকালীন অপ্টিমাইজেশন এবং এটি "সমাধান করে" এর সমস্যার আরও ভাল সমাধান বিদ্যমান।


5
আমি এই উত্তরটি পছন্দ করি - আমি এখন এবং পরে এটিকে পড়তে থাকি। কোনও প্রাসঙ্গিক মন্তব্য নিয়ে আসতে পারে না তাই আমি যা বলতে পারি তা হ'ল - ধন্যবাদ।
Vemv

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

7
@ থমাসডিং: জিসি অবশ্যই একটি অপ্টিমাইজেশন; এটি ন্যূনতম প্রোগ্রামার প্রচেষ্টার জন্য, পারফরম্যান্স এবং অন্যান্য বিভিন্ন প্রোগ্রামের মান মেট্রিক্সের ব্যয়কে অনুকূল করে তোলে।
ম্যাসন হুইলারের

5
মজার বিষয় যে আপনি মোজিলার বাগ ট্র্যাকারটিকে এক পর্যায়ে দেখিয়েছেন, কারণ মোজিলা একেবারে অন্য সিদ্ধান্তে পৌঁছেছে। ফায়ারফক্সের স্মৃতি পরিচালনার ভুল থেকে আগত অসংখ্য সুরক্ষা সমস্যা ছিল এবং এখনও অবিরত রয়েছে। মনে রাখবেন যে একবারে ত্রুটিটি শনাক্ত করার সময় এটি ঠিক করা কতটা সহজ ছিল না - সাধারণত বিকাশকারীরা সমস্যাটি সম্পর্কে সচেতন হওয়ার সময়ের মধ্যেই ক্ষতিটি ইতিমধ্যে হয়ে যায়। এই ধরণের ত্রুটিগুলি প্রথমে প্রবর্তন করা থেকে রক্ষা করতে মোজিলা সঠিকভাবে মরিচা প্রোগ্রামিং ভাষার জন্য অর্থায়ন করছে is

1
মরিচা আবর্জনা-সংগ্রহ ব্যবহার করে না, যদিও এটি রানার সময়ে ত্রুটিগুলি সনাক্ত করার জন্য একটি ডিবাগার ব্যবহার না করে কেবল বিস্তৃত সংকলন-সময় পরীক্ষা দিয়ে ঠিক কীভাবে ম্যাসন বর্ণনা করছে তা রেফারেন্স-কাউন্টিং ব্যবহার করে ...
সান বার্টন

13

বর্তমানের জনপ্রিয় সিস্টেমে যেমন ব্যবহার করা আবর্জনা সংগ্রাহক যেমন সি ++ এর আরআইআই হিসাবে সমপরিমাণ যুগে নন-আবর্জনা-সংগৃহীত মেমরি পরিচালনা কৌশল বিবেচনা করা হয়। এই পদ্ধতিটি দেওয়া হয়েছে, তারপরে স্বয়ংক্রিয় আবর্জনা সংগ্রহের ব্যবহার না করার জন্য ব্যয়টি সর্বনিম্ন এবং জিসি প্রচুর পরিমাণে নিজস্ব সমস্যার পরিচয় দেয়। এই হিসাবে, আমি পরামর্শ দিচ্ছি যে "বেশি কিছু নয়" আপনার সমস্যার উত্তর।

মনে রাখবেন, লোকেরা যখন নন-জিসি-র কথা চিন্তা করে, তখন তারা চিন্তা করে mallocএবং free। তবে এটি একটি বিশাল যৌক্তিক ভ্রান্তি- আপনি ১৯ 1970০ এর দশকের গোড়ার দিকে নন-জিসি রিসোর্স ম্যানেজমেন্টকে 90 এর দশকের শেষের আবর্জনা সংগ্রহকারীদের সাথে তুলনা করছিলেন। এটি স্পষ্টতই বরং একটি অন্যায় তুলনা-যে আবর্জনা সংগ্রহকারীরা যখন ব্যবহার করা হয়েছিল mallocএবং freeডিজাইন করা হয়েছিল তখন কোনও অর্থবহ প্রোগ্রাম পরিচালনা করতে খুব ধীর ছিল, যদি আমি সঠিকভাবে মনে করি। একটি অস্পষ্ট সমতুল্য সময়কাল থেকে কিছু তুলনা করা, উদাহরণস্বরূপ unique_ptr, অনেক বেশি অর্থবহ।

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

অন্যদিকে, তাদের নিজের জিসি পুল ব্যতীত যে কোনও জায়গা থেকে আসা স্মৃতি নিয়ে কাজ করার সময় তারা বিশাল সমস্যায় পড়ে। সমাবর্তন জড়িত থাকাকালীন এগুলি তাদের প্রচুর উপকার হারাবে, কারণ আপনাকে যাইহোক অবজেক্টের মালিকানা বিবেচনা করতে হবে।

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

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

সম্পাদনা: এটি লক্ষণীয় যে আরও উন্নততর কৌশলগুলি যে কোনও ধরণের গতিশীল মেমরির বরাদ্দের প্রয়োজন এড়াতে পারে। উদাহরণস্বরূপ, ব্যবহার বিবেচনা এই যা ++, সব সময়ে কোন গতিশীল বরাদ্দ দিয়ে সি ওয়াই-সমন্বয় প্রয়োগ।


এখানে বর্ধিত আলোচনা সাফ করা হয়েছে: প্রত্যেকে যদি বিষয়টিকে আরও আলোচনার জন্য চ্যাট করতে নিতে পারে তবে আমি সত্যিই এটির প্রশংসা করব।

@ ডেড এমএমজি, আপনি কি জানেন যে সংযুক্তিটি করার কথা? এটি মিলিত হওয়ার কথা। সংজ্ঞা অনুসারে, কম্বিনেটরটি কোনও ফ্রি ভেরিয়েবল ছাড়াই একটি ফাংশন।
এসকে-যুক্তি

2
@ এসকে-যুক্তি: আমি এটিকে নিখুঁতভাবে টেমপ্লেট দ্বারা প্রয়োগ করতে এবং কোনও সদস্যের ভেরিয়েবল না বেছে নিতে পারতাম। তবে আপনি ক্লোজারগুলিতে পাস করতে সক্ষম হবেন না, যা এটির কার্যকারিতা উল্লেখযোগ্যভাবে সীমাবদ্ধ করে। আড্ডায় আসতে যত্ন?
ডেড এমজি

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

4
@ এসকে-যুক্তি: আপনি কেন আড্ডায় আসবেন না , যেমন বিনয়ী মডারেটর জিজ্ঞাসা করেছিলেন? এছাড়াও, একটি Y- সংযুক্তকারী একটি Y- সংযুক্তকারী, এটি কাজ করে বা এটি করে না। ওয়াই-কম্বিনেটরের হাস্কেল সংস্করণটি মূলত এইটির মতোই, রাজ্যটি প্রকাশ করা আপনার কাছ থেকে গোপন রয়েছে।
ডেড এমজি

11

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

প্রকৃতপক্ষে, জিসিড ভাষায় রচিত প্রোগ্রামগুলিতে মেমরি ফাঁসগুলি প্রায়শই ঘন ঘন হয়, কারণ এই ভাষাগুলি প্রোগ্রামারগুলিকে অলস করে তোলে এবং তাদের সুরক্ষার একটি ভ্রান্ত ধারণা অর্জন করতে পারে যে ভাষাটি সর্বদা কোনওভাবে (যাদুতে) প্রতিটি বস্তুর যত্ন নিতে পারে যে তারা আর চিন্তা করতে চান না।

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

এছাড়াও, প্রত্যেকের অবনতির জন্য সরবরাহের জন্য আলাদাভাবে বিবৃতিতে অভিব্যক্তিগুলিকে ভেঙে না ফেলে, ক্রিয়াকলাপের প্রোগ্রামিং ফ্যাশনে টাইট কোড লেখার, এক্সপ্রেশনগুলির ভিতরে অবজেক্টগুলিতে হেরফের করার ক্ষমতা সহ প্রোগ্রামারকে সরবরাহ করার জন্য আবর্জনা সংগ্রহ দরকারী is একক বস্তু যা অভিব্যক্তিতে অংশ নেয়।

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


4

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

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


1
@ ম্যাসন হুইলারের, এমনকি সি ++ একটি খুব সীমাবদ্ধ রূপের প্রয়োগ করে। তবে এটি প্রায় একটি যথাযথ, সাধারণভাবে ব্যবহারযোগ্য বন্ধ নয়।
এসকে-যুক্তি

1
আপনি ভুল. কোনও জিসি আপনাকে স্ট্যাক ভেরিয়েবলগুলি উল্লেখ করতে পারে না তা থেকে আপনাকে রক্ষা করতে পারে না। এবং এটি মজাদার- সি ++ এ আপনিও "গৌণিকভাবে বরাদ্দ করা চলকটিতে একটি পয়েন্টার অনুলিপি করতে পারেন যা সঠিকভাবে এবং স্বয়ংক্রিয়ভাবে ধ্বংস হয়ে যাবে" পদ্ধতিরও।
ডেড এমজি

1
@ ডেড এমজি, আপনি কি দেখতে পাচ্ছেন না যে আপনার কোডটি শীর্ষে তৈরি অন্য কোনও স্তরের মাধ্যমে নিম্ন স্তরের সত্তা ফাঁস হচ্ছে?
এসকে-যুক্তি

1
@ এসকে-লজিক: ঠিক আছে, আমাদের একটি টার্মিনোলজির সমস্যা আছে। আপনার "আসল বন্ধ" এর সংজ্ঞা কী এবং তারা কী করতে পারে যে ডেলফির ক্লোজারগুলি পারে না? (এবং আপনার সংজ্ঞায় মেমরি পরিচালনা সম্পর্কিত যে কোনও কিছুই লক্ষ্য পোস্টগুলিকে সরিয়ে নিয়েছে Let's আসুন আচরণের বিষয়ে কথা বলি, বাস্তবায়নের বিশদটি নয়))
ম্যাসন হুইলারের

1
@ এসকে-লজিক: ... এবং আপনার কি এমন কোনও উদাহরণ রয়েছে যা ডেলফির ক্লোজারগুলি সাধন করতে পারে না এমন সরল-লেপ-লম্পট-ক্লোজার দিয়ে করা যায়?
ম্যাসন হুইলারের

2

সত্যই, আপনার নিজের মেমরিটি পরিচালনা করা বাগের আরও একটি সম্ভাব্য উত্স।

আপনি যদি কলটি ভুলে যান free(বা আপনি যে কোনও ভাষাতে সমান যা কিছু বলুন), আপনার প্রোগ্রামটি তার সমস্ত পরীক্ষা পাস করতে পারে তবে মেমরি ফাঁস করতে পারে। এবং একটি পরিমিত জটিল প্রোগ্রামে, কোনও কলকে উপেক্ষা করা একেবারে সহজ free


3
মিস freeকরা সবচেয়ে খারাপ জিনিস নয়। শুরুর দিকে freeঅনেক বেশি বিধ্বংসী।
হার্বি

2
আর ডাবল free!
কোয়ান্ট_দেব

হে হে! আমি উপরের দুটি মন্তব্য উভয় সঙ্গে যেতে চাই। আমি কখনই এগুলির একটি লঙ্ঘন নিজেই করিনি (যতদূর আমি জানি), তবে এর প্রভাবগুলি কতটা ভয়াবহ হতে পারে তা আমি দেখতে পাচ্ছি। কোয়ান্ট_দেবের উত্তরটি সব বলেছে - মেমরি বরাদ্দ এবং ডি-বরাদ্দের সাথে ভুলগুলি খুঁজে পাওয়া এবং সমাধান করা কুখ্যাত।
দাউদ বলেছেন মনিকা

1
এটি একটি ভ্রান্তি। আপনি "1970 এর প্রথমদিকে" "1990 এর শেষের দিকে" তুলনা করছেন। GCs যে সময়ে অস্তিত্ব যা mallocএবং freeGo to অ জিসি উপায় ছিল অতি খুব কিছু জন্য উপযোগী হতে ধীরে ছিলেন। আপনার এটিকে আরআইআইআই এর মতো একটি আধুনিক নন-জিসি পদ্ধতির সাথে তুলনা করা দরকার।
ডেডএমজি

2
@ ডেডজিএম আরআইআই হ'ল ম্যানুয়াল মেমরি পরিচালনা নয়
কোয়ান্ট_দেব

2

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


1

আমি মনে করি যে ভাষা উন্নয়নের এক বড় waveেউয়ের অংশ হওয়া ছাড়া জিসির সাথে কোনও সম্পর্ক নেই এমন ভাষার উন্নতির জন্য প্রচুর ক্রেডিট পায় garbage

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

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

সুতরাং আমি জানি এটিই একমাত্র জিসি সুবিধা, তবে আমি এটি ছাড়া বাঁচতে পারি না। আমি মনে করি না যে কোনও ধরণের ওওপি এটি ছাড়াই উড়ে যাবে।


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

@ মেসনহিলার: যখন মালিকের অবজেক্টটি মুক্ত হওয়ার সময় হবে তখন তার মালিকানাধীন বস্তুগুলি রেফারেন্সযুক্ত সমস্ত জায়গাগুলি জানতে হবে। এই তথ্যটি বজায় রাখা এবং রেফারেন্সগুলি মুছে ফেলার জন্য এটি ব্যবহার করা আমার কাছে এক ভয়ঙ্কর কাজ বলে মনে হচ্ছে। আমি প্রায়শই উল্লেখ করেছি যে উল্লেখগুলি এখনও পরিষ্কার করা যায়নি। আমাকে মালিককে মুছে ফেলা হিসাবে চিহ্নিত করতে হয়েছিল, তবে এটি নিরাপদে নিজেকে মুক্ত করতে পারে কিনা তা পর্যায়ক্রমে পর্যায়ক্রমে এটিকে জীবন্ত করে তুলুন। আমি কখনও ডেল্ফি ব্যবহার করি নি, তবে মৃত্যুদন্ড কার্যকর করার দক্ষতায় সি # / জাভা সামান্য ত্যাগের জন্য সি ++ এর চেয়ে বেশি সময় বিকাশের সময় আমাকে একটি বড় উত্সাহ দিয়েছিল। (সমস্ত
জিসির

1

শারীরিক ফুটো

জিসি ঠিকানার যে ধরণের বাগগুলি দেখে মনে হয় (কমপক্ষে কোনও বাহ্যিক পর্যবেক্ষকের কাছে) এমন এক ধরণের জিনিস যা কোনও প্রোগ্রামার তার ভাষা, গ্রন্থাগার, ধারণাগুলি, আইডিয়োম ইত্যাদি ভাল জানেন না। তবে আমি ভুল হতে পারি: ম্যানুয়াল মেমোরি হ্যান্ডলিং অভ্যন্তরীণ জটিল?

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

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

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

জিসির সিউডো-ফর্মের অনুরূপ কিছু ছাড়াই এটি কঠিন (রেফারেন্স গণনা, উদাহরণস্বরূপ) যখন কোনও বস্তুর জীবদ্দশায় কোনও প্রকার স্থগিত / অ্যাসিনক্রোনাস প্রসেসিংয়ের জন্য বাড়ানো প্রয়োজন, সম্ভবত অন্য থ্রেড দ্বারা।

ঝাঁকুনি পয়েন্টার

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

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

আমার জন্য বিষয়টি সর্বদা সুরক্ষিত ছিল। এমনকি যখন আমরা freeকোনও পয়েন্টারের মাধ্যমে স্মরণ করি , উত্সটিতে যদি অন্য কোনও পয়েন্টার থাকে তবে সেগুলি ঝোলা (অবৈধ) পয়েন্টার হয়ে যাবে।

আমরা যখন এই ঝুঁকিপূর্ণ পয়েন্টারগুলির পয়েন্টগুলি অ্যাক্সেস করার চেষ্টা করি তখন আমরা অপরিজ্ঞাত আচরণের দিকে ধাবিত হয়েছি, যদিও প্রায় সবসময়ই সেগফল্ট / অ্যাক্সেস লঙ্ঘন একটি শক্ত, তাত্ক্ষণিক ক্রাশের দিকে পরিচালিত করে।

আমি উপরে উল্লিখিত সমস্ত নেটিভ অ্যাপ্লিকেশনগুলিতে একটি অস্পষ্ট প্রান্তের কেস রয়েছে যা মূলত এই সমস্যাটির কারণে ক্র্যাশ হতে পারে, এবং অবশ্যই স্থানীয় কোডে লিখিত নোংরা অ্যাপ্লিকেশনগুলির ন্যায্য অংশ রয়েছে যা খুব ক্র্যাশ-ভারী, এবং প্রায়শই এই সমস্যা কারণে বড় অংশ।

... এবং এর কারণ আপনি জিসি ব্যবহার করেন বা না করেন তা নির্বিশেষে রিসোর্স ম্যানেজমেন্ট কঠোর। ব্যবহারিক পার্থক্য প্রায়শই হয় হয় ফাঁস হয় (জিসি) বা ক্রাশ করা (জিসি ছাড়াই) একটি ভুলের মুখে রিসোর্স অব্যবস্থাপনার দিকে পরিচালিত করে।

রিসোর্স ম্যানেজমেন্ট: আবর্জনা সংগ্রহ

জটিল রিসোর্স ম্যানেজমেন্ট একটি কঠিন, ম্যানুয়াল প্রক্রিয়া যাই হোক না কেন। জিসি এখানে কিছু স্বয়ংক্রিয় করতে পারে না।

আসুন একটি উদাহরণ নেওয়া যাক যেখানে আমাদের এই বস্তুটি রয়েছে, "জো"। জো বেশ কয়েকটি সংস্থার দ্বারা রেফারেন্স করেছেন যার কাছে তিনি একজন সদস্য। প্রতি মাসে বা তাই তারা তার ক্রেডিট কার্ড থেকে সদস্যপদ ফি আহরণ করে।

এখানে চিত্র বর্ণনা লিখুন

জো তার জীবনকাল নিয়ন্ত্রণ করতে আমাদের কাছে একটি উল্লেখ রয়েছে। ধরা যাক, প্রোগ্রামার হিসাবে আমাদের আর জোয়ের দরকার নেই। তিনি আমাদের উদ্বিগ্ন হতে শুরু করেছেন এবং আমাদের আর তাঁর সাথে এই আচরণের সময় নষ্ট করার জন্য এই সংস্থাগুলির দরকার নেই need সুতরাং আমরা তাঁর জীবনলগ্ন রেফারেন্সটি সরিয়ে তাকে পৃথিবী থেকে মুছে ফেলার চেষ্টা করি।

এখানে চিত্র বর্ণনা লিখুন

... তবে অপেক্ষা করুন, আমরা আবর্জনা সংগ্রহ ব্যবহার করছি। জো এর প্রতিটি দৃ reference় উল্লেখ তাকে চারপাশে রাখবে। সুতরাং আমরা তাঁর যে সংস্থাগুলির অন্তর্ভুক্ত তার থেকে তাকে রেফারেন্সগুলি সরিয়ে দিই (তাকে সদস্যতা ছাড়াই)।

এখানে চিত্র বর্ণনা লিখুন

... ওফ, বাদে আমরা তার ম্যাগাজিনের সাবস্ক্রিপশন বাতিল করতে ভুলে গেছি! জো স্মৃতিতে প্রায় রয়ে গেছে, আমাদের উদ্রেক করে এবং সংস্থানগুলি ব্যবহার করে এবং ম্যাগাজিন সংস্থাটিও প্রতিমাসে জো-এর সদস্যপদ প্রক্রিয়া অব্যাহত রাখে।

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

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

রিসোর্স ম্যানেজমেন্ট: ম্যানুয়াল

এখন আসুন আমরা জো এবং ম্যানুয়াল মেমরি ম্যানেজমেন্টের জন্য পয়েন্টারগুলি ব্যবহার করি এমন বিকল্পটি বিবেচনা করি:

এখানে চিত্র বর্ণনা লিখুন

এই নীল লিঙ্কগুলি জোয়ের জীবনকাল পরিচালনা করে না। আমরা যদি তাকে পৃথিবীর মুখ থেকে সরিয়ে নিতে চাই, আমরা ম্যানুয়ালি তাকে বিনষ্ট করার অনুরোধ করছি, এরকম:

এখানে চিত্র বর্ণনা লিখুন

এখন এটি আমাদের পুরো জায়গাগুলিতে ঝাঁকুনি পয়েন্টারগুলির সাথে ছেড়ে যায়, সুতরাং আসুন জোতে পয়েন্টারগুলি সরিয়ে দিন।

এখানে চিত্র বর্ণনা লিখুন

... উফফফফ, আমরা আবার একই একই ভুলটি করেছি এবং জো এর ম্যাগাজিনের সাবস্ক্রিপশনটি সাবস্ক্রাইব করতে ভুলে গেছি!

এখন বাদে আমাদের কাছে ঝুঁকির পয়েন্টার রয়েছে। যখন ম্যাগাজিনের সাবস্ক্রিপশন জো এর মাসিক ফি প্রক্রিয়া করার চেষ্টা করবে তখন পুরো বিশ্ব বিস্ফোরিত হবে - সাধারণত আমরা তাত্ক্ষণিকভাবে হার্ড ক্র্যাশ পাই।

এই একই বেসিক রিসোর্স অব্যবস্থাপনা ভুল যেখানে বিকাশকারী কোনও উত্সের সমস্ত পয়েন্টার / রেফারেন্স ম্যানুয়ালি মুছে ফেলার ভুলে গিয়েছিল স্থানীয় অ্যাপ্লিকেশনগুলিতে প্রচুর ক্র্যাশ হতে পারে। সাধারণত তারা যতক্ষণ চালায় এগুলি তারা মেমরিটিকে জড়িয়ে রাখে না কারণ তারা প্রায়শই এই ক্ষেত্রে সরাসরি ক্র্যাশ হয়ে থাকে।

বাস্তব জগতে

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

কেউ, কোনও দিন, সেই কোডবেসে কোথাও কোথাও সংস্থানসমূহের অব্যবস্থাপনা করার সুযোগটি বেশ উচ্চতার দিকে ঝুঁকির সম্ভাবনা রয়েছে এবং জিসির সাথে বা তার বাইরেও সম্ভাবনা একই। মূল তফাতটি এই ভুলের ফলে কী ঘটবে তা হ'ল এটিও সম্ভবত ভুল করে যে এই ভুলটি কত দ্রুত চিহ্নিত করা এবং ঠিক করা হবে।

ক্রাশ বনাম ফাঁস

এখন কোনটি খারাপ? একটি তাত্ক্ষণিক ক্রাশ, বা একটি নিঃশব্দ স্মৃতি ফাঁস যেখানে জো রহস্যজনকভাবে চারপাশে লম্বা?

বেশিরভাগের উত্তরটি সম্ভবত উত্তর দিতে পারে, তবে আসুন আমরা এই সফ্টওয়্যারটি কয়েক ঘন্টা, সম্ভবত কয়েকদিন ধরে চালানোর জন্য ডিজাইন করা হয়েছে এবং এর মধ্যে জো এবং জেনের প্রতিটি আমরা একটি গিগা বাইটের সাহায্যে সফ্টওয়্যারটির মেমরির ব্যবহার বাড়িয়ে তোলে। এটি একটি মিশন-সমালোচনামূলক সফ্টওয়্যার নয় (ক্র্যাশগুলি আসলে ব্যবহারকারীদের হত্যা করে না), তবে একটি পারফরম্যান্স-সমালোচনামূলক।

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

ফ্লিপ দিকে, যদি এটি একটি মিশন-সমালোচনামূলক সফ্টওয়্যার যেখানে কর্মক্ষমতা লক্ষ্য নয়, কেবল কোনও উপায়ে ক্রাশ না করা সম্ভব হয়, তবে লিকটি করা সম্ভবত পছন্দনীয়।

দুর্বল রেফারেন্স

দুর্বল রেফারেন্স হিসাবে পরিচিত জিসি স্কিমগুলিতে এই ধারণাগুলির একটি সংকর রয়েছে available দুর্বল রেফারেন্স সহ, আমরা এই সমস্ত সংস্থাকে দুর্বল-রেফারেন্স জো রাখতে পারি কিন্তু দৃ the় রেফারেন্স (জো এর মালিক / লাইফলাইন) চলে গেলে তাকে অপসারণ করা থেকে বিরত রাখতে পারি না। তা সত্ত্বেও, জো যখন এই দুর্বল রেফারেন্সগুলির কাছাকাছি থাকবে না তখন আমরা সনাক্ত করতে সক্ষম হওয়ার সুবিধা পেয়ে থাকি, যাতে আমাদের প্রকারের সহজেই পুনরুত্পাদনযোগ্য ত্রুটি পেতে দেয়।

দুর্ভাগ্যক্রমে দুর্বল উল্লেখগুলি প্রায় ব্যবহার করা হয় না যতটা সম্ভবত তাদের ব্যবহার করা উচিত, তাই প্রায়শই অনেকগুলি জটিল জিসি অ্যাপ্লিকেশনগুলি জটিল সি অ্যাপ্লিকেশনটির তুলনায় সম্ভবত অনেক কম ক্র্যাশ হয়ে থাকলেও লিকের জন্য খুব বেশি সংবেদনশীল হতে পারে eg

যাই হোক না কেন, জিসি আপনার জীবনকে সহজ বা কঠিন করে তোলে বা না করে এটি আপনার সফ্টওয়্যারটির ফাঁস এড়ানোর পক্ষে কতটা গুরুত্বপূর্ণ, এবং এই ধরণের জটিল সংস্থান পরিচালনার সাথে সম্পর্কিত কিনা তা নির্ভর করে deals

আমার ক্ষেত্রে, আমি একটি কার্যকারিতা-সমালোচনামূলক ক্ষেত্র যেখানে সম্পদ গিগাবাইট মেগাবাইটের বিঘত শত শত, এবং মেমরি মুক্তি ব্যবহারকারীদের উপরে মত ভুলের কারণেই আন অনুরোধ যখন আসলে হতে পারে না কাজ কম বাঞ্ছনীয় একটি ক্র্যাশ করে। ক্র্যাশগুলি স্পট করা এবং পুনরুত্পাদন করা সহজ, এটি প্রায়শই প্রোগ্রামারের পছন্দের ধরণের বাগটি তৈরি করে এমনকি এটি ব্যবহারকারীর সবচেয়ে কম প্রিয়, এমনকি এগুলির অনেকগুলি ক্র্যাশ এমনকি ব্যবহারকারীর কাছে পৌঁছানোর আগেই একটি বুদ্ধিমান পরীক্ষার পদ্ধতিতে প্রদর্শিত হবে।

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


-1

মেমরির সাথে কাজ করার সময় সি ++ প্রোগ্রামারদের দ্বারা সমস্যার সম্মুখীন হওয়ার একটি তালিকা এখানে রয়েছে:

  1. স্ট্যাক বরাদ্দ মেমরিতে স্কোপিংয়ের সমস্যা দেখা দেয়: যেখানে আউট বরাদ্দ করা হয়েছিল তার বাইরে তার জীবদ্দশায় প্রসারিত হয় না this এই সমস্যার তিনটি মূল সমাধান রয়েছে: হিপ মেমরি এবং কল স্ট্যাকের মধ্যে বরাদ্দ পয়েন্টকে উপরের দিকে সরানো বা অভ্যন্তরীণ বস্তু থেকে বরাদ্দ দেওয়া ।
  2. আকারের সমস্যাটি বরাদ্দকৃত স্ট্যাকের মধ্যে এবং অভ্যন্তরীণ অবজেক্ট থেকে বরাদ্দ এবং আংশিকভাবে স্তরের বরাদ্দ মেমরি: মেমরি ব্লকের আকার রানটাইমে পরিবর্তিত হতে পারে না। সমাধান হিপ মেমরি অ্যারে, পয়েন্টার এবং লাইব্রেরি এবং পাত্রে।
  3. অভ্যন্তরীণ বস্তুগুলি থেকে বরাদ্দকালে সংজ্ঞা সমস্যার ক্রম হ'ল: প্রোগ্রামের অভ্যন্তরীণ ক্লাসগুলি সঠিক ক্রমযুক্ত হওয়া প্রয়োজন। সমাধানগুলি একটি গাছের উপর নির্ভরশীলতা সীমাবদ্ধ করে এবং ক্লাসগুলি পুনরায় সাজিয়ে রাখে এবং ফরোয়ার্ড ঘোষণা, এবং পয়েন্টার এবং হিপ মেমরি ব্যবহার না করে এবং সামনের ঘোষণাগুলি ব্যবহার করে।
  4. ভিতরে-বাইরে সমস্যা অবজেক্ট মেমরির মধ্যে রয়েছে। বস্তুর অভ্যন্তরে স্মৃতি অ্যাক্সেসকে দুটি ভাগে বিভক্ত করা হয়, কিছু স্মৃতি কোনও বস্তুর ভিতরে থাকে এবং অন্য স্মৃতি এর বাইরে থাকে এবং প্রোগ্রামারদের এই সিদ্ধান্তের উপর ভিত্তি করে রচনা বা রেফারেন্স ব্যবহার করতে সঠিকভাবে চয়ন করতে হবে। সমাধানগুলি সিদ্ধান্তটি সঠিকভাবে করছে, বা পয়েন্টার এবং হিপ মেমরি।
  5. পুনরাবৃত্ত বস্তুর সমস্যা অবজেক্ট মেমরির মধ্যে। যদি একই বস্তুটি নিজের ভিতরে স্থাপন করা হয় এবং সমাধানগুলি হল রেফারেন্স, হিপ মেমরি এবং পয়েন্টার হয় তবে অবজেক্টগুলির আকার অসীম হয়ে যায়।
  6. মালিকানা ট্র্যাকিংয়ের সমস্যা হিপ বরাদ্দ মেমরির মধ্যে রয়েছে, হিপ বরাদ্দ মেমরির ঠিকানা সম্বলিত পয়েন্টারটি বরাদ্দ পয়েন্ট থেকে ডিএলোকেশন পয়েন্টে পাস করতে হবে। সমাধানগুলি বরাদ্দ মেমরি, বস্তু-বরাদ্দ মেমরি, অটো_পিটার, শেয়ার্ড_পিটার, অনন্য_পিটার, স্টডিলিব পাত্রে স্ট্যাক হয়।
  7. মালিকানা সদৃশ সমস্যাটি হ'ল বরাদ্দ মেমরির মধ্যে রয়েছে: বিলোপ কেবল একবার করা যেতে পারে। সমাধানগুলি বরাদ্দ মেমরি, বস্তু-বরাদ্দ মেমরি, অটো_পিটার, শেয়ার্ড_পিটার, অনন্য_পিটার, স্টডিলিব ধারকগুলি স্ট্যাক are
  8. নাল পয়েন্টার সমস্যাটি বরাদ্দ মেমরির মধ্যে রয়েছে: রানটাইমগুলিতে পয়েন্টারগুলিকে অনেকগুলি অপারেশন ক্র্যাশ করে তোলে making সমাধানগুলি হ'ল স্ট্যাক মেমরি, অবজেক্ট-বরাদ্দ মেমরি এবং গাদা অঞ্চল এবং রেফারেন্সগুলির যত্ন সহকারে বিশ্লেষণ।
  9. মেমরি ফাঁস সমস্যা হ'ল বরাদ্দ মেমরির মধ্যে: প্রতিটি বরাদ্দ মেমরি ব্লকের জন্য কল মুছতে ভুলে যাওয়া। সমাধানগুলি ভ্যালগ্রাইন্ডের মতো সরঞ্জাম।
  10. স্ট্যাক ওভারফ্লো সমস্যা স্ট্যাক মেমরি ব্যবহার করছে এমন পুনরাবৃত্ত ফাংশন কলগুলির জন্য। সাধারনত স্ট্যাকের আকার সম্পূর্ণভাবে সংকলনের সময় নির্ধারিত হয়, পুনরাবৃত্তাকারী অ্যালগরিদমের ক্ষেত্রে বাদে। ওএসের স্ট্যাকের আকারকে ভুল সংজ্ঞা দেওয়াও প্রায়শই এই সমস্যা তৈরি করে যেহেতু স্ট্যাক স্পেসের প্রয়োজনীয় আকারের পরিমাপ করার কোনও উপায় নেই।

আপনি দেখতে পাচ্ছেন যে হ্যাপ মেমরিটি প্রচুর বিদ্যমান সমস্যাগুলি সমাধান করছে, তবে এটি অতিরিক্ত জটিলতার কারণ হয়ে দাঁড়ায়। জিসি সেই জটিলতার একটি অংশ পরিচালনা করার জন্য ডিজাইন করা হয়েছে। (দুঃখিত যদি কিছু সমস্যার নাম এই সমস্যার সঠিক নাম না হয় - কখনও কখনও সঠিক নামটি বের করাও কঠিন)


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