নিম্নলিখিত কোডটি প্রথম দৃষ্টিতে বরং নির্দোষ বলে মনে হচ্ছে। bar()
কোনও গ্রন্থাগুলি কিছু লাইব্রেরির কার্যকারিতার সাথে ইন্টারঅ্যাক্ট করতে ফাংশনটি ব্যবহার করে । (এটি একটি bar()
অস্থায়ী মান বা অনুরূপ কোনও রেফারেন্স ফেরত দেওয়ার পরেও দীর্ঘকাল ধরে কাজ করেছে )) তবে এখন এটি কেবল একটি নতুন উদাহরণ ফিরে আসছে B
। B
আবার একটি ফাংশন রয়েছে a()
যা পুনরাবৃত্তযোগ্য টাইপের কোনও অবজেক্টের রেফারেন্স দেয় A
। ব্যবহারকারী এই অবজেক্টটি জিজ্ঞাসা করতে চায় যা B
দ্বারা পুনরায় ফিরে আসা অস্থায়ী বস্তুটি bar()
পুনরাবৃত্তি শুরুর আগেই ধ্বংস হয়ে যাওয়ার কারণে সেগফল্টের দিকে নিয়ে যায়।
এর জন্য আমি কারা (গ্রন্থাগার বা ব্যবহারকারী) দোষী। সমস্ত লাইব্রেরি সরবরাহিত ক্লাস আমার কাছে পরিষ্কার দেখায় এবং অবশ্যই অন্য কিছু কোডের চেয়ে আলাদা কিছু করে না (সদস্যদের কাছে রেফারেন্স ফিরিয়ে দেওয়া, স্ট্যাকের উদাহরণগুলি ফিরিয়ে দেওয়া, ...) করে থাকে। ব্যবহারকারীর পাশাপাশি কিছু ভুল বলে মনে হচ্ছে না, তিনি সেই বস্তুটির আজীবন কোনও কিছুই না করে কেবল কোনও বস্তুর উপরে পুনরাবৃত্তি করছেন।
(একটি সম্পর্কিত প্রশ্ন হতে পারে: কেউ যদি সাধারণ নিয়মটি প্রতিষ্ঠা করে যে লুপ হেডারে একাধিক চেইন কল দ্বারা পুনরুদ্ধার করা এমন কোনও কিছুর উপরে কোডটি "রেঞ্জ-ভিত্তিক-ফর-পুনরাবৃত্তি") করা উচিত নয় কারণ এই কলগুলির মধ্যে কোনও কল ফিরে আসতে পারে rvalue?)
#include <algorithm>
#include <iostream>
// "Library code"
struct A
{
A():
v{0,1,2}
{
std::cout << "A()" << std::endl;
}
~A()
{
std::cout << "~A()" << std::endl;
}
int * begin()
{
return &v[0];
}
int * end()
{
return &v[3];
}
int v[3];
};
struct B
{
A m_a;
A & a()
{
return m_a;
}
};
B bar()
{
return B();
}
// User code
int main()
{
for( auto i : bar().a() )
{
std::cout << i << std::endl;
}
}