ডায়নামিক মেমরি বরাদ্দ সি ++ দিয়ে কীভাবে কাজ করবেন?



এই নিবন্ধটি সি ++ এ ডায়নামিক মেমোরি বরাদ্দ অন্বেষণ করে একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা আপনাকে রিয়েল টাইম রিসোর্সের জন্য আপনার মেমরির প্রয়োজনগুলি বিবেচনা করতে দেয়।

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

সুতরাং আসুন আমরা সি ++ এ ডায়নামিক মেমরি বরাদ্দ সম্পর্কিত এই নিবন্ধটি দিয়ে শুরু করি





গতিশীল মেমরি বরাদ্দ প্রয়োজন?

ধরা যাক, আমরা একটি বাক্য অক্ষরের অ্যারে হিসাবে ইনপুট করতে চাই তবে অ্যারেতে প্রয়োজনীয় অক্ষরের সঠিক সংখ্যা সম্পর্কে আমরা নিশ্চিত নই।

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



উপরের ক্ষেত্রে, সংকলন-কাল (যখন কম্পিউটার কোডটি সংকলন করে এবং ব্যবহারকারী যদি স্ট্রিংটি ব্যবহারকারী দ্বারা ইনপুট হয়) না হয় ততক্ষণ পর্যন্ত অ্যারের সঠিক আকার সম্পর্কে আমাদের ধারণা নেই। এই জাতীয় ক্ষেত্রে, আমরা এটি ব্যবহার করি নতুন অপারেটর.

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

ডায়নামিক অলোকেশনের সাহায্যে একটি প্রোগ্রাম রানটাইমের সময় স্মৃতি পেতে পারে।



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

স্থির মেমরি বরাদ্দ এবং গতিশীল মেমরি বরাদ্দ মধ্যে পার্থক্য:

এটি যে কোনও সি ++ প্রোগ্রামের জন্য ব্যবহৃত একটি বেসিক মেমরি আর্কিটেকচার:

স্মৃতি - গতিশীল মেমরি বরাদ্দ - এডুরেকা

সি ++ আরোহী ক্রমে সংখ্যা বাছাই করুন

আমাদের এটির মতো একটি চিত্রের প্রয়োজন হবে

স্ট্যাকটি স্ট্যাটিক মেমোরি বরাদ্দের জন্য এবং গতিশীল মেমরি বরাদ্দের জন্য হ্যাপ ব্যবহার করা হয়, উভয়ই কম্পিউটারের র‌্যামে সঞ্চিত।

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

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

সি ++ এ ডায়নামিক মেমরি বরাদ্দ নিয়ে এই নিবন্ধটি নিয়ে চলেছেন

মেমরি ব্যবহার করে বরাদ্দ নতুন কীওয়ার্ড

সি ++ এ নতুন অপারেটর রানটাইমে মেমরি বরাদ্দ করতে ব্যবহৃত হয় এবং মেমরিটি বাইটে বরাদ্দ করা হয়। দ্য নতুন অপারেটর হিপগুলিতে গতিশীল মেমরি বরাদ্দের জন্য একটি অনুরোধকে বোঝায়। পর্যাপ্ত স্মৃতি উপলব্ধ থাকলে নতুন অপারেটর মেমরিটি আরম্ভ করে এবং সদ্য বরাদ্দকৃত এবং প্রাথমিক মেমরির ঠিকানাটি পয়েন্টার ভেরিয়েবলটিতে ফিরিয়ে দেয়।

বাক্য গঠন:

ডেটাটাইপ * পয়েন্টার_নাম = নতুন ডেটাটাইপ

উদাহরণ:

int * ptr = new int // নিম্নলিখিত দুটি উপায়ে গতিশীল বরাদ্দ থাকা অবস্থায় আমরা একটি পরিবর্তনশীল ঘোষণা করতে পারি। int * ptr = new int (10) int * ptr = new int {15} // নতুন অপারেটর টাইপ ডেটা-টাইপের মেমরির একটি ব্লক (একটি অ্যারে) বরাদ্দ করতেও ব্যবহৃত হয়। int * ptr = new int [20] // উপরোক্ত বিবৃতিটি ক্রমাগতভাবে টাইপ int এর 20 পূর্ণসংখ্যার জন্য মেমরি বরাদ্দ করে এবং ক্রমিকের প্রথম উপাদানটিকে একটি পয়েন্টারকে ‘পিটিআর’ পয়েন্টারে প্রত্যাবর্তন করে।

বিঃদ্রঃ : যদি হিপ বরাদ্দ দেওয়ার মতো পর্যাপ্ত মেমরি না থাকে তবে নতুন অনুরোধটি ব্যতিক্রম চিহ্নিত করে std :: Bad_alloc, যদি না নতুন অপারেটরের সাথে 'nothrow' ব্যবহার না করা হয়, তবে এই ক্ষেত্রে এটি একটি NUL পয়েন্টারটি ফেরত দেয়। সুতরাং প্রোগ্রামটিতে এটি ব্যবহারের আগে নতুন দ্বারা উত্পাদিত পয়েন্টার ভেরিয়েবলটি পরীক্ষা করা ভাল অভ্যাস।

সি ++ এ ডায়নামিক মেমরি বরাদ্দ নিয়ে এই নিবন্ধটি নিয়ে চলেছেন

মেমোরি ব্যবহারের ডিলোকেশন মুছে ফেলা কীওয়ার্ড:

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

বাক্য গঠন:

পয়েন্টার_ভেরিয়েবলটি মুছুন // এখানে, পয়েন্টার_ভেরিয়েবল হ'ল পয়েন্টার যা নতুন দ্বারা নির্মিত ডেটা অবজেক্টকে নির্দেশ করে। মুছুন [] পয়েন্টার_ভেরিয়েবল // পয়েন্টার-ভেরিয়েবল দ্বারা নির্দেশিত গতিশীলভাবে বরাদ্দ করা অ্যারে মেমরি মুক্ত করতে আমরা নীচের ফর্মটি মুছুন:

উদাহরণ:

মুছুন পিটিআর ডিলিট [] পিটিআর

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

কীভাবে পুনরাবৃত্তিযোগ্য জাভা ব্যবহার করবেন

সি ++ এ ডায়নামিক মেমরি বরাদ্দ নিয়ে এই নিবন্ধটি নিয়ে চলেছেন

গতিশীলভাবে অ্যারে বরাদ্দ করা হচ্ছে

গতিশীল মেমরি বরাদ্দকরণের ধারণার প্রধান ব্যবহার হ'ল একটি অ্যারেতে মেমরি বরাদ্দ করার জন্য যখন আমাদের এটির আকার নির্দিষ্ট করে ঘোষণা করতে হয় তবে এটি সম্পর্কে নিশ্চিত নই।

এর ব্যবহার বোঝার জন্য একটি উদাহরণ দেখুন।

# নেমস্পেস ব্যবহার করে স্ট্যান্ড ইন্ট মেইন () le ইন্ট লেন, যোগফল = 0 কাউট ব্যবহার করুন<< 'Enter the no. of students in the class' <>লেন ইন্ট * চিহ্নস = নতুন ইনট [লেন] // ডায়নামিক মেমোরি বরাদ্দ চিকিত্সা<< 'Enter the marks of each student' << endl for( int i = 0 i>* (চিহ্ন + i)} এর জন্য (int i = 0 i)

ব্যাখ্যা:
এই উদাহরণে প্রথমে আমরা ব্যবহারকারীকে একটি ক্লাসে শিক্ষার্থীর সংখ্যা জিজ্ঞাসা করি এবং আমরা এর মান লেন ভেরিয়েবলে সঞ্চয় করি। তারপরে আমরা পূর্ণসংখ্যার একটি অ্যারের ঘোষণা করি এবং এ বিবৃতিটি ব্যবহার করে লেন ভেরিয়েবলের মধ্যে সংরক্ষিত মানের সমানভাবে মেমরির মধ্যে স্থান বরাদ্দ করি * চিহ্ন = নতুন ইনট [দৈর্ঘ্য] এভাবে এটি 'দৈর্ঘ্য' (1 আকারের আকার) সমান স্থান বরাদ্দ করা হয় পূর্ণসংখ্যা) '। কোডের বাকি অংশটি স্ব-বর্ণনামূলক।

সি ++ এ ডায়নামিক মেমরি বরাদ্দ নিয়ে এই নিবন্ধটি নিয়ে চলেছেন

বস্তুর জন্য গতিশীল মেমরি বরাদ্দ

আমরা গতিশীলভাবে অবজেক্টগুলিও বরাদ্দ করতে পারি।

যেহেতু আমরা জানি যে কনস্ট্রাক্টর একটি বিশেষ শ্রেণীর সদস্য ফাংশন যা কোনও বস্তুর সূচনা করতে ব্যবহৃত হয় এবং ডেসট্রাক্টর একটি শ্রেণীর সদস্য ফাংশন যা যখনই বস্তুর ক্ষেত্রের বাইরে চলে যায় তখন তাকে ডাকা হয়।

অবজেক্টের জন্য বরাদ্দকৃত মেমরিটি প্রকাশ করতে ডেস্ট্রাক্টর ব্যবহার করা যেতে পারে। এটি নিম্নলিখিত পরিস্থিতিতে বলা হয়।

  • যখন কোনও স্থানীয় অবজেক্ট সুযোগের বাইরে চলে যায়
  • গ্লোবাল অবজেক্টের জন্য, যখন কোনও অপারেটর শ্রেণীর অবজেক্টের পয়েন্টারে প্রয়োগ করা হয়

বস্তুগুলিকে গতিশীলভাবে মেমরি বরাদ্দ করার সময় আমরা আবার পয়েন্টার ব্যবহার করতে পারি।

আসুন অবজেক্টগুলির একটি অ্যারের উদাহরণ দেখি।

# নেমস্পেস স্ট্যান্ড ক্লাস র্যান্ডম {সর্বজনীন: র্যান্ডম () {cout ব্যবহার করে অন্তর্ভুক্ত করুন<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

আউটপুট:

ব্যাখ্যা:

কনস্ট্রাক্টরকে তিনবার ডাকা হবে কারণ আমরা এলোমেলোভাবে শ্রেণীর তিনটি বস্তুর মেমরি বরাদ্দ করি। এই প্রতিটি বস্তুর সময় ধ্বংসকারীকে তিনবার কল করা হবে। ‘এলোমেলো * এ = নতুন এলোমেলো [3]’ এই বিবৃতিটি আমাদের অবজেক্টের গতিশীল মেমরির বরাদ্দের জন্য দায়ী।

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

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