জিসি অনুমানযোগ্য এবং সংরক্ষিত সংস্থান নিয়ে কাজ করে। ভিএম এর উপর সম্পূর্ণ নিয়ন্ত্রণ রয়েছে এবং কোন ঘটনাগুলি কখন এবং কখন তৈরি হয় তার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে। এখানে কীওয়ার্ডগুলি "সংরক্ষিত" এবং "সম্পূর্ণ নিয়ন্ত্রণ"। হ্যান্ডলগুলি ওএস দ্বারা বরাদ্দ করা হয়, এবং পয়েন্টারগুলি হ'ল ... পরিচালিত জায়গার বাইরে বরাদ্দকৃত সংস্থানগুলিতে ভাল পয়েন্টার। সে কারণে হ্যান্ডলস এবং পয়েন্টারগুলি পরিচালিত কোডের অভ্যন্তরে ব্যবহারের মধ্যে সীমাবদ্ধ নয়। এগুলি একই প্রক্রিয়াটিতে পরিচালিত এবং পরিচালনা না করে পরিচালনা করা কোড দ্বারা এবং ব্যবহার করা যেতে পারে often
একজন "রিসোর্স কালেক্টর" কোনও হ্যান্ডেল / পয়েন্টারটি কোনও পরিচালিত জায়গার মধ্যে ব্যবহার করা হচ্ছে কিনা তা যাচাই করতে সক্ষম হবে তবে এটি তার স্মৃতি স্থানের বাইরে কী ঘটছে তা সংজ্ঞায়িত নয় (এবং বিষয়গুলি আরও খারাপ করে তুলতে কিছু হ্যান্ডেল ব্যবহার করা যেতে পারে প্রক্রিয়া সীমানা জুড়ে)।
একটি ব্যবহারিক উদাহরণ হ'ল নেট সিএলআর। কেউ কোড লিখতে স্বাদযুক্ত সি ++ ব্যবহার করতে পারেন যা পরিচালিত এবং নিয়ন্ত্রণহীন মেমরির উভয় জায়গাতেই কাজ করে; পরিচালনা এবং পরিচালনা না করা কোডের মধ্যে হ্যান্ডলগুলি, পয়েন্টারগুলি এবং রেফারেন্সগুলি প্রায় পাস করা যেতে পারে। সিএলআরকে পরিচালিত সংস্থাগুলিতে রেফারেন্সগুলির সন্ধানের জন্য সিএলআরকে অনুমতি দেওয়ার জন্য পরিচালনাবিহীন কোডটি অবশ্যই বিশেষ নির্মাণ / প্রকারগুলি ব্যবহার করে। তবে এটি এটি করতে পারে সেরা। এটি হ্যান্ডলগুলি এবং পয়েন্টারগুলির সাহায্যে একই কাজ করতে পারে না এবং কারণ বলেছিলেন যে কোনও নির্দিষ্ট হ্যান্ডেল বা পয়েন্টার প্রকাশ করা ঠিক আছে কিনা তা রিসোর্স সংগ্রাহক জানেন না।
সম্পাদনা:। নেট সিএলআর সম্পর্কিত, আমি। নেট প্ল্যাটফর্মের সাথে সি ++ বিকাশের অভিজ্ঞতা নেই। সম্ভবত এমন কোনও ব্যবস্থা আছে যা সিএলআর পরিচালনা ও নিয়ন্ত্রণহীন কোডের মধ্যে হ্যান্ডলগুলি / পয়েন্টারগুলির রেফারেন্সগুলি ট্র্যাক করে রাখতে দেয়। যদি এটি হয় তবে সিএলআর সেই সমস্ত সংস্থাগুলির আজীবন যত্ন নিতে পারে এবং যখন সেগুলির সমস্ত উল্লেখ মুছে ফেলা হয় (ভাল, কমপক্ষে কিছু পরিস্থিতিতে এটি পারে)) যে কোনও উপায়ে, সর্বোত্তম অনুশীলনগুলি হ্যান্ডলগুলি (বিশেষত ফাইলগুলিতে নির্দেশকারী) নির্দেশ দেয় এবং পয়েন্টারগুলির প্রয়োজন না হওয়ার সাথে সাথে তা প্রকাশ করা উচিত। একজন রিসোর্স কালেক্টর সেই সাথে মেনে চলবে না, এটি না থাকার আরও একটি কারণ।
সম্পাদনা 2: এটি কেবলমাত্র পরিচালিত জায়গার অভ্যন্তরে ব্যবহার করা হলে নির্দিষ্ট হ্যান্ডেলটি মুক্ত করার জন্য কিছু কোড লিখতে সিএলআর / জেভিএম / ভিএমএস-ইন-জেনারেলের তুলনামূলকভাবে তুচ্ছ। নেট মধ্যে এমন কিছু হবে:
// This class offends many best practices, but it would do the job.
public class AutoReleaseFileHandle {
// keeps track of how many instances of this class is in memory
private static int _toBeReleased = 0;
// the threshold when a garbage collection should be forced
private const int MAX_FILES = 100;
public AutoReleaseFileHandle(FileStream fileStream) {
// Force garbage collection if max files are reached.
if (_toBeReleased >= MAX_FILES) {
GC.Collect();
}
// increment counter
Interlocked.Increment(ref _toBeReleased);
FileStream = fileStream;
}
public FileStream { get; private set; }
private void ReleaseFileStream(FileStream fs) {
// decrement counter
Interlocked.Decrement(ref _toBeReleased);
FileStream.Close();
FileStream.Dispose();
FileStream = null;
}
// Close and Dispose the Stream when this class is collected by the GC.
~AutoReleaseFileHandle() {
ReleaseFileStream(FileStream);
}
// because it's .NET this class should also implement IDisposable
// to allow the user to dispose the resources imperatively if s/he wants
// to.
private bool _disposed = false;
public void Dispose() {
if (_disposed) {
return;
}
_disposed = true;
// tells GC to not call the finalizer for this instance.
GC.SupressFinalizer(this);
ReleaseFileStream(FileStream);
}
}
// use it
// for it to work, fs.Dispose() should not be called directly,
var fs = File.Open("path/to/file");
var autoRelease = new AutoReleaseFileHandle(fs);