নিম্নলিখিত পরিস্থিতিতে আমি কিছু খুব অদ্ভুত আচরণ (ঝনঝন এবং জিসিসিতে) পেয়েছি। আমার কাছে একটি ভেক্টর রয়েছে, nodes
যার একটি উপাদান রয়েছে, ক্লাসের একটি উদাহরণ Node
। আমি তারপরে একটি ফাংশন বলি যা ভেক্টরে nodes[0]
একটি নতুন যুক্ত Node
করে। নতুন নোড যুক্ত করা হলে কলিং অবজেক্টের ক্ষেত্রগুলি পুনরায় সেট করা হয়! তবে, ফাংশনটি শেষ হয়ে গেলে তারা আবার স্বাভাবিক অবস্থায় ফিরে আসবে বলে মনে হয়।
আমি বিশ্বাস করি এটি একটি ন্যূনতম প্রজননযোগ্য উদাহরণ:
#include <iostream>
#include <vector>
using namespace std;
struct Node;
vector<Node> nodes;
struct Node{
int X;
void set(){
X = 3;
cout << "Before, X = " << X << endl;
nodes.push_back(Node());
cout << "After, X = " << X << endl;
}
};
int main() {
nodes = vector<Node>();
nodes.push_back(Node());
nodes[0].set();
cout << "Finally, X = " << nodes[0].X << endl;
}
কোন ফলাফল
Before, X = 3
After, X = 0
Finally, X = 3
যদিও আপনি আশা করতে পারেন এক্সটি প্রক্রিয়া দ্বারা অপরিবর্তিত থাকবে।
অন্যান্য জিনিস আমি চেষ্টা করেছি:
- যদি আমি কোনও
Node
অভ্যন্তর যুক্ত করে এমন লাইনটি সরিয়ে ফেলিset()
, তবে এটি প্রতিবার এক্স = 3 আউটপুট করে। - যদি আমি একটি নতুন তৈরি করে
Node
এবং (Node p = nodes[0]
) এ এটি কল করি তবে আউটপুট 3, 3, 3 হবে - যদি আমি একটি রেফারেন্স তৈরি করি
Node
এবং এটিতে কল করি (Node &p = nodes[0]
) তবে আউটপুট 3, 0, 0 হয় (ভেক্টর পুনরায় আকার দেওয়ার পরে রেফারেন্সটি হারিয়ে যায় বলে সম্ভবত এটিই হয়?)
এই অপরিবর্তিত আচরণ কি কোনও কারণে? কেন?
reserve(2)
কল করার আগে যদি ভেক্টরকে ডেকে আনাset()
হত তবে এটি সংজ্ঞায়িত আচরণ হবে। কিন্তু এর মতো একটি ফাংশন লেখারset
জন্যreserve
অপরিজ্ঞাত আচরণটি এড়াতে খারাপ কল্পনা করার জন্য ব্যবহারকারীকে কল করার আগে যথাযথ আকারের প্রয়োজন হয় , তাই এটি করবেন না।