সি ++ তে মেমরি পরিচালনা করতে প্রোগ্রামার সময়টি কত সময় ব্যয় করে


39

যে সমস্ত লোক জঞ্জাল সংগ্রহ করা ভাষাতে অভ্যস্ত তারা প্রায়শই সি +++ এর মেমরি পরিচালনা থেকে ভয় পান। সেখানে সরঞ্জাম, মত auto_ptrএবং shared_ptrযা তোমাদের জন্য মেমরি ব্যবস্থাপনা কাজগুলো অনেক হ্যান্ডেল করবে। প্রচুর সি ++ লাইব্রেরি সেই সরঞ্জামগুলির পূর্বাভাস দেয় এবং মেমরি পরিচালনার কাজগুলি পরিচালনা করার নিজস্ব উপায় রয়েছে।

মেমরি পরিচালনার কাজে আপনি কতটা সময় ব্যয় করেন?

আমার সন্দেহ হয় যে এটি আপনার ব্যবহার করা লাইব্রেরির সেটের উপর নির্ভরশীল, তাই দয়া করে আপনার উত্তরটি কোনটিতে প্রযোজ্য তা বলুন এবং যদি তারা এটিকে আরও ভাল বা আরও খারাপ করে তোলে।


1
আসলে তেমন কিছু নয় ... বিশেষত সি ++ 0 এক্স, রেফারেন্স এবং এসটিএল সহ। এমনকি আপনি কোনও স্মৃতি পরিচালনা না করে কোডও লিখতে পারেন।
কোডার

9
সাধারণভাবে: আপনি যদি অভিজ্ঞ হন তবে তেমনটি নয়। আপনি যদি সি ++ (-> সাধারণত শিকারের মেমরি / রিসোর্স লিক) সম্পর্কে অবগত হন তবে অনেক।
মার্চ

1
আমি আসল প্রশ্নটি খুঁজে পাই, আজকাল, বাসি রেফারেন্সগুলি তাড়া করার বিষয়ে আরও বেশি। এবং এটি সাধারণত প্রতিবারই স্পষ্টভাবে স্পষ্ট হয়, বিরক্ত হয় যে এটি আগে ধরা পড়ে নি: পি
ম্যাথিউ এম।

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

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

উত্তর:


54

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

সুতরাং এটি প্রকল্পের উপর নির্ভর করে তবে বেশিরভাগ সময় এটি মেমরি পরিচালনা নয় যা আপনাকে পরিচালনা করতে পারে তবে কেবল জীবনকালকেই আপত্তি করে। এটি স্মার্ট পয়েন্টার ব্যবহার করে সমাধান করা হয় , এটি হ'ল একটি আইডিয়োমেটিক সি ++ টুল যা আরআইআই থেকে আসে ।

একবার আপনি RAII বুঝতে পারলে , মেমরি পরিচালনার কোনও সমস্যা হবে না।

তারপরে যখন আপনার কাঁচা মেমরি অ্যাক্সেসের প্রয়োজন হবে, আপনি এটি "নির্দিষ্ট জায়গায়" নয়, পুল অবজেক্ট বাস্তবায়নের মতো খুব সুনির্দিষ্ট, স্থানীয়করণযোগ্য এবং সনাক্তকারী কোডে করবেন do

এই ধরণের কোডের বাইরে আপনার মেমরির প্রয়োজন হয় না, কেবল আজীবন বস্তু।

"শক্ত" অংশটি হ'ল RAII বোঝা।


10
একেবারে সত্য. গত ৫ বছরে, উত্তরাধিকার কোডের সাথে কাজ করার সময় আমি কেবল "মুছুন" লিখেছি।
drxzcl

3
আমি একটি অত্যন্ত স্ট্যাক-আকার সীমাবদ্ধ এম্বেড থাকা পরিবেশে কাজ করি। আরআইআইআই যতটা দুর্দান্ত, স্ট্যাক স্পেস একটি প্রিমিয়ামে থাকলে এটি ভাল কাজ করে না। সুতরাং এটি পয়েন্টার মাইক্রো ম্যানেজমেন্টে ফিরে এসেছে।
bastibe

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

12
@ পেপারফ্লায়ার: আরএআইআই হ'ল deleteম্যানুয়ালি তুলনায় বেশি স্ট্যাক স্থান গ্রহণ করবে না , যদি না আপনার একটি বিষ্ঠা বাস্তবায়ন থাকে।
ডেডএমজি

2
@ পেপারফ্লায়ার: স্তূপের স্মার্ট পয়েন্টার একই স্থান নেয়; পার্থক্যটি হ'ল সংকলকটি কোনও ফাংশন থেকে সমস্ত প্রস্থান করে রিসোর্স ডিলোকেশন কোড সন্নিবেশ করায়। এবং যেহেতু এটি এত ব্যাপকভাবে ব্যবহৃত হয়, তাই এটি সাধারণত ভাল-অপ্টিমাইজড হয় (যেমন একাধিক প্রস্থানকে ভাঁজ করে এমনভাবে একসাথে ফোল্ডিং করা যায় - আপনি কোডের পরে কোডটি রাখতে পারবেন না return)
এমএসএলটারস

32

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

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

সুতরাং, সংক্ষেপে, আমি কোনও সি ++ বিকাশকারীর বেশিরভাগ সময় মেমরি পরিচালনা সম্পর্কে উদ্বিগ্ন হয়ে ব্যয় করার পরামর্শ দেব না। হিসাবে klaim এর উত্তর ইঙ্গিত, একবার আপনি RAII উপর একটি হ্যান্ডল পেতে, বাকি শুধু প্রতিবিম্ব হয়।


3
আমি বিশেষতঃ HTTPWebRequest.GetResponse জিসি ভাষায় হ্যান্ডেল করে এবং ক্রাশ শুরু করে তা কীভাবে পছন্দ করি। জিসি দুর্দান্ত, যতক্ষণ না এটি চুষতে শুরু করে কারণ এখনও সম্পদগুলি ফুটো হয়। msdn.microsoft.com/en-us/library/… "সতর্কতা" দেখুন।
সংকেতপদ্ধতিরচয়িতা

6
সম্পদ হিসাবে স্মৃতি দেখার জন্য +1। উত্তরাধিকার কোড বা না, কতবার আমরা অট্ট আউট চিত্কার করতে হবে: স্মৃতি ব্যবস্থাপনা একটি হল দক্ষতা এবং না একটি অভিশাপ
অ্যাকোহার্ড

4
@ কোডার আমি অনুসরণ করি কিনা তা নিশ্চিত নন .. জিসি ব্যর্থ হওয়ায় যেহেতু যেভাবেই সম্পদের অপব্যবহার করা সম্ভব ..? আমি মনে করি সি # আইডিস্পোজেবল ব্যবহার করে ডিটারমিনিস্টিক রিসোর্স রিলিজ করার একটি ভাল কাজ করে ...
সর্বোচ্চ

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

5
@deadalnix- এর কাছে তাদের finalizeনির্মাণ রয়েছে। তবে এটি কখন ডাকা হবে তা আপনি জানেন না। আপনি কি সকেট, বা ওয়েবরেস্পোনস অবজেক্টগুলি শেষ করার আগেই তা ঘটবে? সঙ্গত কারণেই আপনি নিবন্ধগুলি পেয়ে যাবেন যা আপনাকে বলে যে আপনার উপর নির্ভর করা উচিত নয় finalize
ডিসাস্টার

13

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

বাস্তবতাটি হ'ল ভাগ করা, অনন্য এবং অ স্বত্বের সমস্ত জাহাজ আপনার সি ++ 11 সংকলক সহ সমস্ত জাহাজ, এবং আপনাকে কেবল পুরানো কোড দিয়েও কাজ করতে ছোট ছোট অ্যাডাপ্টারগুলি লিখতে হবে।


1
সি ++ এর সাথে আপনার কতটা দক্ষতা থাকতে হবে) ক) একটি কাস্টম ডিল্টার লিখতে হবে খ) জানেন যে একটি কাস্টম মুছানো আপনার প্রয়োজন? আমি জিজ্ঞাসা করেছি কারণ একটি নতুন GC'd ভাষা চয়ন করা এবং পুরো জিনিসটি না জেনে খুব কাছে থেকে সঠিক হওয়া সহজ বলে মনে হচ্ছে - সি ++ তেও ঠিক অধিকার পাওয়া সহজ?
শান ম্যাকমিলান

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

2
"একটি জিসি'ডি ভাষা বাছাই করুন" এর দ্বারা আমি বোঝাতে চেয়েছিলাম যে আমি জাভা / সি # / রুবি / পার্ল / জাভাস্ক্রিপ্ট / পাইথনের মধ্যে হ্যাপড করেছি, এবং তাদের সবার একই সংস্থান পরিচালনার স্টাইল রয়েছে - মেমরিটি বেশিরভাগই স্বয়ংক্রিয় এবং অন্য সব কিছু , আপনি পরিচালনা করতে হবে। এটি আমার কাছে মনে হচ্ছে আপনি সি ++ এর পরিচালনার সরঞ্জামগুলি বলছেন যে আপনি ফাইল হ্যান্ডলগুলি / ডিবি সংযোগগুলি / ইত্যাদি মেমরির মতো একইভাবে পরিচালনা করতে পারেন এবং আপনি এটি একবার শিখে ফেললে এটি তুলনামূলক সহজ। মস্তিষ্কের অস্ত্রোপচার নয়। আমি কি সঠিকভাবে বুঝতে পারি?
শান ম্যাকমিলান

3
@ সিয়ানম্যাক মিলান: হ্যাঁ, এটি ঠিক ঠিক, এবং এটি জটিল নয়।
ডেডজিএম

11

যখন আমি সি ++ প্রোগ্রামার ছিলাম (অনেক দিন আগে), বাগগুলি পুনরুত্পাদন করার জন্য কঠোর সমাধান করার চেষ্টা করার সময় আমি মেমরি পরিচালনা সংক্রান্ত বাগ সম্পর্কে চিন্তা করে দীর্ঘ সময় কাটিয়েছি ।

মডেম সি ++ সহ, মেমরি ম্যানেজমেন্ট কোনও ইস্যুতে অনেক কম, তবে এটি সঠিক করার জন্য আপনি একটি বড় দলের প্রত্যেককে বিশ্বাস করতে পারেন। এর ব্যয় / সময় কত:

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

তাই এটি শুধু সময় কাটানোর "নয় করছেন ", এই বড় বড় প্রকল্পের উপর একটি সংখ্যার বেশি।


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

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

1
হ্যাঁ বেশিরভাগ দোকান জাভা বা। নেট এ চলে গেছে। আবর্জনা সংগ্রহ খারাপ কোডের অনিবার্য ক্ষতি হ্রাস করে।
জেরেমি

1
অদ্ভুতভাবে যথেষ্ট, আমাদের এই সমস্যাগুলি নেই।
ডেভিড থর্নলি 3:53

1
@ ডেভিডথর্নলি, আমি মনে করি যে অনেক সমস্যা সি ++ তে ইউআই কোড লেখা থেকে হয়েছিল, আজকাল বেশিরভাগ সি ++ কোডটি আমি ইউআই নয়
ইয়ান

2

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


2

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

আমি ব্যয় করার বেশিরভাগ সময় (ক্লায়েন্ট হিসাবে) অন্যান্য এপিআইএস থেকে বিভিন্ন ধরণের সময় ব্যয় করা হয়, তাই তারা আপনার প্রোগ্রামগুলির প্রেক্ষাপটে ভালভাবে কাজ করে। উদাহরণ: এই হল আমার ThirdPartyFont ধারক, এবং ... এটা এই ভাবে এই বৈশিষ্ট্য সমর্থন করে, এবং কার্যকরী ধ্বংস, এবং রেফারেন্স এই ভাবে বেড়ে চলেছে, এবং এই পথ অনুলিপি, এবং । এই কনস্ট্রাক্টেরগুলির বেশিরভাগ জায়গায় থাকা প্রয়োজন এবং এগুলি স্থাপনের জন্য প্রায়শই এটি যৌক্তিক জায়গা। আপনি সময় হিসাবে এটি অন্তর্ভুক্ত করতে চান কিনা বা আপনার সংজ্ঞার উপর নির্ভর করে (বাস্তবায়নের এই এপিএসের সাথে ইন্টারফেস করার সময়, থাকা দরকার, ঠিক আছে?)।

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

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

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

যদি আপনি পাত্রে (অটো / শেয়ার্ড পয়েন্টার) ব্যবহার না করেন তবে আপনি কেবল ব্যথার জন্য আবেদন করছেন।

আমি আমার নিজস্ব লাইব্রেরি প্রয়োগ করেছি। এই জিনিসগুলি বাস্তবায়নে আমার সময় লাগে তবে বেশিরভাগ লোকেরা পুনরায় ব্যবহার করে (যা সাধারণত একটি ভাল ধারণা)।


1

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

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

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

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

System.IO.StreamReader file = new System.IO.StreamReader(path);
try
{
    file.ReadBlock(buffer, index, buffer.Length);
}
catch (System.IO.IOException e)
{
    ...
}
finally
{
    if (file != null)
        file.Close();
}

সি ++ এ ম্যানুয়ালি ফাইলগুলি বন্ধ করার মতো জিনিসগুলি করার দরকার নেই। ফলস্বরূপ বা সাধারণ বা ব্যতিক্রমী কার্যকরকরণের পথ হিসাবে তারা সুযোগের বাইরে চলে যায় না কেন তত্ক্ষণাত তারা সুযোগের বাইরে চলে যায় তত্ক্ষণাত তারা স্বয়ংক্রিয়ভাবে নিজেকে বন্ধ করে দেয়। মেমরি সম্পর্কিত সম্পদের জন্য অনুরূপ জিনিস std::vectorfile.Close()উপরের মতো কোডগুলি প্রায়শই অস্বীকার করা হবে যেহেতু বিশেষত একটি finallyব্লকের প্রসঙ্গে , প্রস্তাবিত হয় যে স্থানীয় সংস্থানটি ম্যানুয়ালি মুক্ত করতে হবে যখন সি ++ এর চারপাশে পুরো মানসিকতাটি স্বয়ংক্রিয়ভাবে চালিত হয়।

ম্যানুয়াল মেমরি পরিচালনার ক্ষেত্রে, আমি বলব যে সি এর জন্য সর্বোচ্চ, জাভা / সি # একটি মাঝারি পরিমাণ এবং সি ++ এর মধ্যে সর্বনিম্ন প্রয়োজন। সি ++ ব্যবহার করা কিছুটা লজ্জাজনক হওয়ার অনেক কারণ রয়েছে কারণ এটি আয়ত্ত করা খুব কঠিন ভাষা তবে মেমরি পরিচালনা তাদের মধ্যে একটি হওয়া উচিত নয়। বিপরীতে আমি আসলে এটি মনে করি এটি এই দিকটিতে এটি সবচেয়ে সহজ ভাষা।

অবশ্যই সি ++ আপনাকে ম্যানুয়ালি মেমরি বরাদ্দ operator delete/delete[]করতে এবং ম্যানুয়ালি ফ্রি মেমরির দিকে আহ্বান করতে দেয়। এটি আপনাকে সি ফাংশনগুলি mallocএবং এর মতো ব্যবহার করতে দেয়free। তবে এটি প্রাচীন ধাঁচের কোডিং অনুশীলন যা আমি মনে করি যে লোকেরা creditণ দেওয়ার অনেক আগে থেকেই অচল হয়ে পড়েছিল, যেহেতু স্ট্রস্ট্রপ এমনকি প্রথম থেকেই এই শব্দটি রচনা করার আগেই আরআইআইয়ের পক্ষে ছিলেন। সুতরাং আমি এমনকি "আধুনিক সি ++" বলাই মোটামুটি মনে করি না রিসোর্স ম্যানেজমেন্টকে স্বয়ংক্রিয়ভাবে চালিত করে, কারণ এটির পাশাপাশি উদ্দেশ্যটিই মনে করা হত। আপনি অন্যথায় অন্যথায় ব্যবহারিকভাবে ব্যতিক্রম-সুরক্ষা পেতে পারেন না। এটি ঠিক যে 90 এর দশকের গোড়ার দিকে প্রচুর বিপথগামী বিকাশকারীরা সি ++ অবজেক্টের সাথে সি হিসাবে ব্যবহার করার চেষ্টা করেছিলেন, প্রায়শই ব্যতিক্রম-হ্যান্ডলিংকে পুরোপুরি উপেক্ষা করে এবং কখনও সেভাবে ব্যবহার করার কথা ছিল না। আপনি যদি সি ++ ব্যবহার করেন যা ব্যবহারিকভাবে সর্বদা ব্যবহারের নিয়ত ছিল, তবে মেমরি পরিচালনা পুরোপুরি স্বয়ংক্রিয় হয় এবং সাধারণত আপনাকে ম্যানুয়ালি মোকাবেলা করতে হবে এমন কিছু নয় (বা এর সাথে ডিল করা উচিত)।


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

0

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


1
আপনার পরিবেশে এমন কিছু আছে যা আপনাকে ব্যবহার auto_ptrএবং বন্ধুরা বন্ধ করে দেয় ?
শন ম্যাকমিলান

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