ধরা যাক আমার গেমটিতে এমন একটি দানব রয়েছে যা কমিকাজে প্লেয়ারের উপর বিস্ফোরিত হতে পারে। আসুন এ দানবটির জন্য এলোমেলোভাবে একটি নাম বেছে নেওয়া যাক: একটি লতা। সুতরাং, Creeper
ক্লাসটির এমন একটি পদ্ধতি রয়েছে যা দেখতে এরকম কিছু দেখাচ্ছে:
void Creeper::kamikaze() {
EventSystem::postEvent(ENTITY_DEATH, this);
Explosion* e = new Explosion;
e->setLocation(this->location());
this->world->addEntity(e);
}
ইভেন্টগুলি সারিবদ্ধ নয়, তারা তাত্ক্ষণিক প্রেরণ করা হবে। এটি Creeper
কলটির অভ্যন্তরে কোথাও মুছে ফেলা হবে postEvent
। এটার মতো কিছু:
void World::handleEvent(int type, void* context) {
if(type == ENTITY_DEATH){
Entity* ent = dynamic_cast<Entity*>(context);
removeEntity(ent);
delete ent;
}
}
কারণ পদ্ধতিটি চলমান Creeper
অবস্থায় অবজেক্টটি মুছে ফেলা হয়েছে kamikaze
, এটি অ্যাক্সেস করার চেষ্টা করলে ক্রাশ হবে this->location()
।
একটি সমাধান হ'ল ইভেন্টগুলি বাফারে সারি করে পরে তা প্রেরণ করা। এটি কি সি ++ গেমগুলির সাধারণ সমাধান? এটি কিছুটা হ্যাকের মতো মনে হয়, তবে এটি কেবল ভিন্ন মেমরি পরিচালনার অনুশীলন সহ অন্যান্য ভাষার সাথে আমার অভিজ্ঞতার কারণেই হতে পারে।
সি ++-তে, এই সমস্যাটির আরও ভাল কোনও সাধারণ সমাধান হতে পারে যেখানে কোনও বস্তু ঘটনাক্রমে তার কোনও পদ্ধতির অভ্যন্তর থেকে নিজেকে মুছে ফেলে?
autorelease
অবজেক্টিভ-সি এর বাস্তবায়নটি একবার দেখে নিতে পারেন , যেখানে "কিছুটা" অবধি মুছে ফেলা বন্ধ রয়েছে।