.NET বন্ধ না থাকলে কোনও মেমরি ফাঁস তৈরি হয়?


111

আমার কাছে নিম্নলিখিত কোড রয়েছে:

MemoryStream foo(){
    MemoryStream ms = new MemoryStream();
    // write stuff to ms
    return ms;
}

void bar(){
    MemoryStream ms2 = foo();
    // do stuff with ms2
    return;
}

আমি যে মেমরিস্ট্রিম বরাদ্দ করেছি তা কি কোনওভাবে পরে নিষ্পত্তি হতে ব্যর্থ হওয়ার কোনও সম্ভাবনা আছে কি?

আমি একটি সমালোচক পর্যালোচনা পেয়েছি যাতে আমি ম্যানুয়ালি এটি বন্ধ করে দিই এবং আমি তার বৈধ পয়েন্ট আছে কিনা তা জানার জন্য তথ্যটি খুঁজে পাচ্ছি না।


41
আপনার পর্যালোচককে জিজ্ঞাসা করুন কেন তিনি মনে করেন যে আপনার এটি বন্ধ করা উচিত। যদি তিনি সাধারণ ভাল অনুশীলনের কথা বলেন তবে তিনি সম্ভবত স্মার্ট। যদি সে আগে স্মৃতি প্রকাশের কথা বলে তবে সে ভুল।
জন স্কিটি

উত্তর:


60

যদি কোনও কিছু ডিসপোজযোগ্য হয় তবে আপনার সর্বদা এটি নিষ্পত্তি করা উচিত। usingনিষ্পত্তি bar()হয় তা নিশ্চিত করার জন্য আপনার পদ্ধতিতে একটি বিবৃতি ব্যবহার করা উচিত ms2

এটি অবশেষে আবর্জনা সংগ্রহকারী দ্বারা পরিষ্কার হয়ে যাবে, তবে ডিসপোজ কল করা সর্বদা ভাল অভ্যাস। আপনি যদি আপনার কোডটিতে FxCop চালনা করেন তবে এটি সতর্কতা হিসাবে পতাকাঙ্কিত করবে।


16
ইউজিং ব্লক কলগুলি আপনার জন্য নিষ্পত্তি করে।
নিক

20
@ গ্রাউনওল্ফ: আপনার দৃ as়তা এনক্যাপসুলেশন ভেঙে দিয়েছে। একজন ভোক্তা হিসাবে, এটি কোনও বিকল্প নেই কিনা তা আপনার যত্ন নেওয়া উচিত নয়: এটি যদি অযোগ্য হয় তবে এটি নিষ্পত্তি করা আপনার কাজ।
মার্ক গ্র্যাভেল

4
এই StreamWriter বর্গ জন্য সত্য নয়: এটা সংযুক্ত প্রবাহ নিষ্পত্তি হবে শুধুমাত্র যদি আপনি StreamWriter নিষ্পত্তি - এটা প্রবাহ নিষ্পত্তি না হবে যদি এটি আবর্জনা সংগ্রহ পায় এবং তার finalizer নামক পরার - এই নকশা করা।
বসন্তে 76

4
আমি জানি এই প্রশ্নটি ২০০৮ সালের ছিল, তবে আজ আমাদের কাছে নেট নেট Tas.০ টাস্ক লাইব্রেরি রয়েছে। সৎকার () হল অপ্রয়োজনীয় মধ্যে সবচেয়ে ক্ষেত্রেই যখন কার্যগুলি ব্যবহার করে। যদিও আমি সম্মত হব যে আইডিস্পোজেবলের অর্থ এই হওয়া উচিত "আপনি সমাপ্ত হওয়ার পরে এটিকে আরও ভালভাবে নিষ্পত্তি করুন", এর অর্থ আর এর অর্থ হয় না।
ফিল

7
আইডিস্পোজেবল অবজেক্টটি নিষ্পত্তি করা উচিত নয় এমন আরেকটি উদাহরণ হ'ল HTTPClient aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong বিসিএলের আরও একটি উদাহরণ যেখানে আইডিসপোজেবল অবজেক্ট রয়েছে এবং আপনার প্রয়োজন নেই (বা এমনকি উচিত নয়) নিষ্পত্তিও করতে হবে এটা। এটি কেবল মনে রাখার জন্য যে সাধারণত
বিসিএলে

166

আপনি কিছু ফাঁস করবেন না - কমপক্ষে বর্তমান বাস্তবায়নে in

কল নিষ্পত্তি কল মেমরিস্ট্রিম দ্বারা ব্যবহৃত মেমরিটি আরও দ্রুত সাফ করবে না। এটা তোলে করবে কল, যা বা আপনার জন্য উপযোগী হতে পারে পরে পঠন / লিখন কলের জন্য টেকসই হওয়া থেকে আপনার প্রবাহে বন্ধ।

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

যাহাই হউক না কেন এটা করতে অন্য কোন কারণে যে একটি নতুন বাস্তবায়ন করতে পারে রিসোর্সের নিষ্পত্তি উপর মুক্ত হবো পরিচয় দিন।


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

সেক্ষেত্রে আমি এখনও কেবলমাত্র সাধারণ নীতি অনুসারে এটিকে নিষ্পত্তি করার চেষ্টা করব - ভাল অভ্যাস তৈরি করা ইত্যাদি - তবে এটি খুব জটিল হয়ে উঠলে আমি খুব বেশি চিন্তা করব না।
জন স্কিটি

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

সত্যিই সত্য @Triynko নয়: দেখুন: stackoverflow.com/questions/574019/... বিস্তারিত জানার জন্য।
জর্জ স্টকার

10
YAGNI যুক্তি উভয় উপায়ে গ্রহণ করা যেতে পারে - যেহেতু প্রয়োগকৃত জিনিসগুলি নিষ্পত্তি না করার সিদ্ধান্ত নেওয়া IDisposableএকটি সাধারণ মামলা সাধারণ সেরা-অনুশীলনের বিরুদ্ধে চলেছে, আপনি যুক্তি দিতে পারেন যে এটি সেই ক্ষেত্রেই করা উচিত যা আপনার সত্যিকারের প্রয়োজন না হওয়া পর্যন্ত করা উচিত নয়, YAGNI এর অধীনে নীতি.
জন হান্না

26

হ্যাঁ একটি ফাঁস রয়েছে , আপনি কীভাবে লিক সংজ্ঞায়িত করেন এবং কতটা লটার আপনি বোঝাতে চান তার উপর নির্ভর করে ...

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

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

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

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


6
আমি এই প্রতিক্রিয়া ভালবাসি। কখনও কখনও লোকেরা ব্যবহারের দ্বৈত দায়িত্বটি ভুলে যায়: উত্সাহিত সংস্থান পুনরুদ্ধার এবং আগ্রহী ডেরেফারেন্সিং।
কিট

1
প্রকৃতপক্ষে, যদিও আমি শুনেছি জাভা থেকে আলাদা, সি # সংকলকটি "শেষ সম্ভাব্য ব্যবহার" সনাক্ত করে, সুতরাং যদি ভেরিয়েবলটি তার শেষ রেফারেন্সের পরে সুযোগের বাইরে চলে যায় তবে এটি তার শেষ সম্ভাব্য ব্যবহারের ঠিক পরে আবর্জনা সংগ্রহের জন্য যোগ্য হতে পারে .. এটি আসলে সুযোগের বাইরে চলে যাওয়ার আগে। দেখুন stackoverflow.com/questions/680550/explicit-nulling
Triynko

2
আবর্জনা সংগ্রাহক এবং জিটটার সেভাবে কাজ করে না। স্কোপ একটি ভাষা নির্মাণ এবং রানটাইম মেনে চলবে এমন কিছু নয়। প্রকৃতপক্ষে, আপনি সম্ভবত রেফারেন্সটির স্মৃতিতে থাকা সময়টিকে দীর্ঘায়িত করছেন। Ericlippert.com/2015/05/18/…
পাবলো মন্টিল্লা

8

কলিং .Dispose()(বা মোড়ানো Using) প্রয়োজন হয় না।

আপনি যে কারণটি কল করেছেন .Dispose()তা হ'ল সংস্থানটি যত তাড়াতাড়ি সম্ভব প্রকাশ করা

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


24
একটি মেমোরিস্ট্রিমে ডিসপোজ কল করা কোনও মেমোরি ছাড়ছে না। বাস্তবে, আপনি ডিসপোজ বলার পরেও আপনি একটি মেমরি স্ট্রিমের ডেটা পেতে পারেন - এটি চেষ্টা করুন :)
জোন স্কিট

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

1
FileStreamবস্তু বরাদ্দ ও নিষ্পত্তি করার জন্য একটি কোডিং শৈলী এবং বস্তুর জন্য পৃথক পৃথক রূপ গ্রহণের বিপরীতটি কী MemoryStream?
রবার্ট রসনি

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

@ ত্রিনকো - "অতএব, একবার আপনি এটি নিষ্পত্তি করে দিলে, আপনার যদি এটি এখনও সুযোগের মধ্যে থাকে তবে এটিও বাতিল করতে হবে" - আমি একমত নই। ডিসপোজ করার কল করার পরে যদি এটি আবার ব্যবহার করা হয় তবে এটি নুলারফেরান এক্সসেপশন ঘটাবে। এটি ডিসপোজ করার পরে যদি আবার ব্যবহার না করা হয় তবে এটিকে বাতিল করার দরকার নেই; জিসি যথেষ্ট স্মার্ট।
জো

8

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

MemoryStream foo()
{    
    MemoryStream ms = new MemoryStream();    
    // write stuff to ms    
    return ms;
}

প্রতি:

Stream foo()
{    
   ...
}

এটি জোর দেয় যে কলাররা কী ধরণের স্ট্রিম ফিরিয়ে আনা হচ্ছে সেদিকে খেয়াল রাখা উচিত নয় এবং অভ্যন্তরীণ বাস্তবায়ন (যেমন ইউনিট পরীক্ষার জন্য উপহাস করার সময়) পরিবর্তন করা সম্ভব করে তোলে।

আপনি যদি আপনার বার প্রয়োগে ডিসপোজ ব্যবহার না করেন তবে আপনার তখন সমস্যায় পড়তে হবে:

void bar()
{    
    using (Stream s = foo())
    {
        // do stuff with s
        return;
    }
}

5

সমস্ত স্ট্রিম আইডিস্পোজেবল বাস্তবায়ন করে। আপনার স্মৃতি স্ট্রিমটি একটি ব্যবহারের বিবরণে আবৃত করুন এবং আপনি ভাল এবং জঘন্য হয়ে উঠবেন। ব্যবহারের ব্লকটি নিশ্চিত করবে যে আপনার প্রবাহটি বন্ধ হয়ে গেছে এবং যাই হোক না কেন নিষ্পত্তি করা হবে।

আপনি যেখানেই ফু কে কল করুন সেখানে আপনি (মেমোরিস্ট্রিম এমএস = foo ()) ব্যবহার করে করতে পারেন এবং আমার মনে হয় আপনার এখনও ঠিক আছে।


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

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

2

আপনি মেমরি ফাঁস করবেন না, তবে আপনার স্ট্রিমটি বন্ধ করা উচিত তা বোঝাতে আপনার কোড পর্যালোচক সঠিক। এটি করা ভদ্র ite

আপনি যখন মেমরি ফাঁস করতে পারেন কেবল তখনই আপনি যখন ঘটনাক্রমে স্ট্রিমের কোনও রেফারেন্স রেখে যান এবং কখনই এটি বন্ধ করেন না। আপনি এখনও সত্যই মেমরি ফাঁস করছেন না, তবে আপনি এটি অযথা ব্যবহার করার দাবি করছেন যে পরিমাণ সময় বাড়িয়ে দিচ্ছেন।


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

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

2

আমি মূলত ধারাবাহিকতার জন্য bar()একটি usingবিবৃতিতে মেমরির ধারাটি মোড়ানোর পরামর্শ দেব :

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

আমি সাধারণত foo()কোনও আইডিজিপোজেবল তৈরি ও ফেরত দেওয়ার ক্ষেত্রে অন্যান্য জিনিসটি নিশ্চিত করি তা নিশ্চিত করা যে কোনও বিষয় ব্যতীত নির্মাণের মধ্যে কোনও ব্যর্থতা returnধরা পড়ে এবং ব্যতিক্রমটিকে পুনরায় স্থান দেয়:

MemoryStream x = new MemoryStream();
try
{
    // ... other code goes here ...
    return x;
}
catch
{
    // "other code" failed, dispose the stream before throwing out the Exception
    x.Dispose();
    throw;
}

1

যদি কোনও অবজেক্ট আইডিস্পোজেবল প্রয়োগ করে, আপনার কাজ শেষ করার পরে আপনাকে অবশ্যই .Dispose পদ্ধতিতে কল করতে হবে।

কিছু বস্তুতে, নিষ্পত্তি মানে ক্লোজ এবং বিপরীত হিসাবে একই, সেই ক্ষেত্রে, হয় ভাল good

এখন, আপনার নির্দিষ্ট প্রশ্নের জন্য, না, আপনি মেমরি ফাঁস করবেন না।


3
"মাস্ট" খুব শক্ত শব্দ। যখনই কোনও নিয়ম রয়েছে, সেগুলি ভঙ্গ করার পরিণতিগুলি জানার পক্ষে এটি মূল্যবান। মেমরিস্ট্রিমের জন্য খুব কম ফলাফল রয়েছে।
জন স্কিটি

-1

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


একটি মেমরিস্ট্রিম সবই ইন মেমোরি - এখানে কোনও ফাইল হ্যান্ডেল নেই।
জন স্কিটি

-2

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


1
ঠিক সত্য নয়। ব্যবহারের বিবৃতি থেকে বেরিয়ে আসার সময় নিষ্পত্তি বলা হয়। যখন কোনও বস্তু মাত্র সুযোগের বাইরে চলে যায় তখন নিষ্পত্তি বলা হয় না।
আলেকজান্ডার আব্রামভ

-3

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


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