অন্যরা ইতিমধ্যে অন্যান্য সমস্যাগুলিকে সম্বোধন করেছে, সুতরাং আমি কেবল একটি পয়েন্ট দেখব: আপনি কি কখনও কোনও জিনিস ম্যানুয়ালি মুছতে চান?
উত্তরটি হল হ্যাঁ. @ ডেভিডশওয়ার্টজ একটি উদাহরণ দিয়েছেন তবে এটি মোটামুটি অস্বাভাবিক। আমি একটি উদাহরণ দিচ্ছি যা প্রচুর সি ++ প্রোগ্রামার সর্বদা ব্যবহার করে: এর নীচে রয়েছে: std::vector
(এবং std::deque
যদিও এটি যথেষ্ট পরিমাণে ব্যবহৃত হয় না)।
যেমনটি বেশিরভাগ লোকেরা জানেন, std::vector
আপনি যখন তার বর্তমান বরাদ্দটি ধরে রাখতে পারেন তার চেয়ে বেশি আইটেম যুক্ত করলে / মেমরির একটি বৃহত ব্লক বরাদ্দ করবে। এটি যখন এটি করে, তবে এটির মেমরির একটি ব্লক রয়েছে যা বর্তমানে ভেক্টরটির তুলনায় আরও বেশি বস্তু ধারণ করতে সক্ষম ।
এটি পরিচালনা করতে, vector
কভারগুলির নীচে যা করা হয় তা বস্তুর মাধ্যমে কাঁচা মেমরি বরাদ্দ করা হয় Allocator
(যা আপনি অন্যথায় নির্দিষ্ট না করে বোঝায় এটি ব্যবহার করে ::operator new
)। তারপরে, আপনি যখন push_back
কোনও আইটেম যুক্ত করতে (উদাহরণস্বরূপ) ব্যবহার করেন vector
, অভ্যন্তরীণভাবে ভেক্টর placement new
তার স্মৃতি স্পেসের (পূর্ববর্তী) অব্যবহৃত অংশে একটি আইটেম তৈরি করতে একটি ব্যবহার করে ।
এখন, যখন / আপনি erase
ভেক্টর থেকে কোনও আইটেম হন? এটি কেবল ব্যবহার করতে পারে না delete
- এটি তার মেমরির পুরো ব্লক প্রকাশ করবে; অন্য কোনও ব্যক্তিকে বিনষ্ট না করে, বা মেমোরির যে কোনও ব্লক এটি নিয়ন্ত্রণ করে না তা ছাড়িয়ে ছাড়ানোর জন্য এটির একটি বস্তু ধ্বংস করতে হবে (উদাহরণস্বরূপ, যদি আপনি erase
কোনও ভেক্টর থেকে 5 টি আইটেম করেন, তবে অবিলম্বে push_back
আরও 5 টি আইটেম রয়েছে, এটি গ্যারান্টিযুক্ত যে ভেক্টর পুনরায় কল্পনা করবে না মেমরি আপনি যখন এটি করতে।
এটি করার জন্য, ভেক্টর স্পষ্টভাবে ডেস্ট্রাক্টরকে কল করে মেমরিতে থাকা অবজেক্টগুলিকে সরাসরি ধ্বংস করে, না ব্যবহার করে delete
।
যদি, অনুধাবন করা হয় তবে অন্য কারও কাছে একটি স্ট্রোক ব্যবহার করে একটি মোটামুটি করণীয়ের মতো স্টোরেজ ব্যবহার করে লিখতে vector
হয় (বা এর কিছু রূপ যেমন std::deque
সত্যিই হয়) আপনি প্রায় একই কৌশলটি ব্যবহার করতে চাইবেন।
উদাহরণস্বরূপ, আসুন বিবেচনা করুন আপনি কীভাবে একটি বিজ্ঞপ্তি রিং-বাফার জন্য কোড লিখতে পারেন।
#ifndef CBUFFER_H_INC
#define CBUFFER_H_INC
template <class T>
class circular_buffer {
T *data;
unsigned read_pos;
unsigned write_pos;
unsigned in_use;
const unsigned capacity;
public:
circular_buffer(unsigned size) :
data((T *)operator new(size * sizeof(T))),
read_pos(0),
write_pos(0),
in_use(0),
capacity(size)
{}
void push(T const &t) {
// ensure there's room in buffer:
if (in_use == capacity)
pop();
// construct copy of object in-place into buffer
new(&data[write_pos++]) T(t);
// keep pointer in bounds.
write_pos %= capacity;
++in_use;
}
// return oldest object in queue:
T front() {
return data[read_pos];
}
// remove oldest object from queue:
void pop() {
// destroy the object:
data[read_pos++].~T();
// keep pointer in bounds.
read_pos %= capacity;
--in_use;
}
~circular_buffer() {
// first destroy any content
while (in_use != 0)
pop();
// then release the buffer.
operator delete(data);
}
};
#endif
মানক ধারকগুলি থেকে ভিন্ন, এটি সরাসরি operator new
এবং ব্যবহার করে operator delete
directly আসল ব্যবহারের জন্য, আপনি সম্ভবত একটি বরাদ্দকারী শ্রেণি ব্যবহার করতে চান, তবে এই মুহুর্তের জন্য এটি অবদানের চেয়ে বিভ্রান্ত করার আরও বেশি কিছু করবে (আইএমও, যাইহোক)।