سي++ پروگرامنگ ۾ عام غلطيون ۽ انهن کي ڪيئن درست ڪجي
سي++ پروگرامنگ سڀ کان وڌيڪ طاقتور ۽ لچڪدار پروگرامنگ ٻولين مان هڪ آهي. طريقيڪار، آبجيڪٽ تي مبني، ۽ عام پروگرامنگ کي سپورٽ ڪرڻ جي صلاحيت سان، سي++ وڏي پيماني تي ايپليڪيشنن جي وسيع قسم ۾ استعمال ٿئي ٿو، آپريٽنگ سسٽم کان وٺي اعليٰ ڪارڪردگي واري گيمنگ ايپليڪيشنن تائين. بهرحال، ڪنهن به پروگرامنگ ٻولي وانگر، سي++ ۾ پڻ ڪيتريون ئي عام غلطيون آهن جيڪي ڊولپرز، نوان ۽ تجربيڪار، اڪثر منهن ڏيندا آهن. هي مضمون سي++ پروگرامنگ ۾ ڪجهه عام غلطين تي بحث ڪندو ۽ انهن کي ڪيئن درست ڪجي ان بابت هدايت فراهم ڪندو.
1. غير شروعاتي پوائنٽرز استعمال ڪندي
غلطي:
هڪ غير شروع ٿيل پوائنٽر هڪ نامعلوم ياداشت جي جڳهه ڏانهن اشارو ڪري سگهي ٿو، جيڪو غير متوقع رويي يا پروگرام جي حادثي جو سبب بڻجي سگهي ٿو. هن غلطي جو هڪ مثال هيٺ ڏنل آهي:
"سي پي پي"
int ptr؛ // ptr شروع نه ڪيو ويو آهي
ptr = 10؛ // غلطي: پوائنٽر شروع نه ٿيو
“
ڪيئن درست ڪجي:
استعمال ڪرڻ کان اڳ پوائنٽر کي شروع ڪريو. توهان ان کي `nullptr` سان يا صحيح ميموري ايڊريس سان شروع ڪري سگهو ٿا.
"سي پي پي"
int ptr = nullptr؛ // nullptr سان شروع ڪريو
انٽ ويليو = 10؛
پي ٽي آر = ۽ قدر؛
ptr = 20؛ // هاڻي محفوظ آهي
“
2. ميموري مئنيجمينٽ ۾ غلطيون (ميموري ليڪ)
غلطي:
جڏهن مختص ڪيل ياداشت کي ٻيهر جاري نه ڪيو ويندو آهي ته ميموري ليڪ ٿيندي آهي. اهو هڪ ايپليڪيشن کي وقت سان گڏ وڌيڪ ۽ وڌيڪ ميموري استعمال ڪرڻ جو سبب بڻجي سگهي ٿو، آخرڪار ميموري جي گهٽتائي جو سبب بڻجي سگهي ٿو.
"سي پي پي"
انٽ پي ٽي آر = نئون انٽ[10]؛
// مختص ڪيل ياداشت کي ختم ڪرڻ وساريو
“
ڪيئن درست ڪجي:
هميشه پڪ ڪريو ته مختص ڪيل ميموري کي `delete` يا `delete[]` استعمال ڪندي خالي ڪريو، ان تي منحصر آهي ته ان کي مختص ڪرڻ لاءِ ڇا استعمال ڪيو ويو هو.
"سي پي پي"
انٽ پي ٽي آر = نئون انٽ[10]؛
// ياداشت جو استعمال...
حذف ڪريو[] ptr؛ // مفت مختص ڪيل ياداشت
“
ميموري مئنيجمينٽ کي آسان بڻائڻ لاءِ هڪ سمارٽ پوائنٽرز لائبريري (جهڙوڪ `std::unique_ptr` يا `std::shared_ptr`) استعمال ڪريو.
"سي پي پي"
شامل آهن
ايس ٽي ڊي:: منفرد_پي ٽي آر
// جڏهن ptr اسڪوپ مان نڪرندو ته ميموري پاڻمرادو جاري ٿي ويندي.
“
3. حوالن جي استعمال ۾ غلطيون
غلطي:
ڪنهن مقامي متغير ڏانهن ريفرنس يا پوائنٽر واپس ڪرڻ جيڪو دائري کان ٻاهر ٿي ويو آهي، غير متوقع رويي جو سبب بڻجي سگهي ٿو.
"سي پي پي"
انٽ ۽ گيٽ ريفرنس () {
انٽ ويليو = 10؛
واپسي جي قيمت؛ // غلطي: مقامي متغير جو حوالو واپس ڪرڻ
}
“
ڪيئن درست ڪجي:
مقامي متغيرن جا حوالا واپس ڪرڻ کان پاسو ڪريو. ان جي بدران، جامد متغير استعمال ڪريو، يا اڃا بهتر، قدر واپس ڪريو، يا شيون استعمال ڪرڻ تي غور ڪريو.
"سي پي پي"
انٽ گيٽ ويليو () {
انٽ ويليو = 10؛
واپسي جي قيمت؛ // محفوظ
}
“
4. ڪمپائلر جي غلطي جي پيغامن ۽ ڊيڄاريندڙن کي نظرانداز ڪريو
غلطي:
پروگرامر اڪثر ڪري ڪمپائلر پاران جاري ڪيل غلطي پيغامن ۽ ڊيڄاريندڙن کي نظرانداز ڪندا آهن، جيتوڻيڪ اهي پيغام امڪاني غلطين بابت اهم معلومات فراهم ڪن ٿا.
ڪيئن درست ڪجي:
ڪمپائلر پاران پيدا ٿيندڙ غلطي پيغامن ۽ ڊيڄاريندڙن کي هميشه چيڪ ڪريو ۽ سمجهو. صاف ڪوڊ کي يقيني بڻائڻ لاءِ اعليٰ سطحي ڊيڄاريندڙن کي فعال ڪريو.
مثال طور GCC ۾، وڌيڪ ڊيڄاريندڙ پيدا ڪرڻ لاءِ `-Wall` جھنڊو استعمال ڪريو.
"ڀڄڻ
g++ -وال -o پروگرام main.cpp
“
5. آپريٽر اوور لوڊنگ ۾ غلطي
غلطي:
غلط آپريٽر اوور لوڊنگ غير متوقع رويي يا رن ٽائم غلطين جو سبب بڻجي سگهي ٿي.
"سي پي پي"
ڪلاس منهنجو ڪلاس {
عوامي:
انٽ ڊيٽا؛
مائي ڪلاس آپريٽر+ (مائي ڪلاس ۽ ٻيا مسلسل) {
ڊيٽا واپس ڪريو + other.data؛ // غلطي: MyClass واپس ڪرڻ گهرجي
}
};
“
ڪيئن درست ڪجي:
پڪ ڪريو ته اوور لوڊ ٿيل آپريٽر مناسب قسم واپس ڪري ٿو ۽ ڪلاس جي انويريئنٽس کي محفوظ ڪري ٿو.
"سي پي پي"
ڪلاس منهنجو ڪلاس {
عوامي:
انٽ ڊيٽا؛
مائي ڪلاس آپريٽر+ (مائي ڪلاس ۽ ٻيا مسلسل) {
منهنجي ڪلاس جو نتيجو؛
نتيجو.ڊيٽا = ڊيٽا + ٻيو.ڊيٽا؛
واپسي جو نتيجو؛ // MyClass مان هڪ شئي واپس ڪري ٿو
}
};
“
6. ميڪروز جو غلط استعمال
غلطي:
ميڪرو ڪڏهن ڪڏهن تمام گهڻو يا غلط استعمال ڪيا ويندا آهن، جنهن جي ڪري اهڙيون غلطيون ٿي سگهن ٿيون جن کي رن ٽائم تي ڳولڻ ڏکيو هوندو آهي.
"سي پي پي"
اسڪوائر (x) xx جي وضاحت ڪريو
int نتيجو = SQUARE(5 + 1)؛ // غلطي: نتيجو 5 + 1 5 + 1 آهي
“
ڪيئن درست ڪجي:
بهتر قسم جي سيڪيورٽي ۽ ڪنٽرول لاءِ ميڪرو کي مسلسل اظهار يا ٽيمپليٽس سان تبديل ڪريو.
"سي پي پي"
سانچي
ٽي چورس (ٽي x) {
واپسي xx؛
}
int نتيجو = چورس (5 + 1)؛ // استعمال ڪرڻ لاءِ محفوظ
“
7. سي-اسٽائل جي ڪمن جو غلط استعمال
غلطي:
سي-اسٽائل فنڪشن جهڙوڪ `strcpy` يا `sprintf` استعمال ڪندي جيڪي بفر اوور فلو لاءِ ڪمزور آهن.
"سي پي پي"
چار src[] = "هيلو، دنيا!"؛
چار منزل [5]؛
strcpy(dest, src); // غلطي: بفر اوور فلو
“
ڪيئن درست ڪجي:
محفوظ C++ افعال استعمال ڪريو جهڙوڪ `std::string` يا `std::vector`.
"سي پي پي"
شامل آهن
std::string src = "هيلو، دنيا!"؛
ايس ٽي ڊي:: اسٽرنگ ڊيسٽ = src؛
“
8. غلطي جي ڳولا کي نظرانداز ڪرڻ
غلطي:
I/O آپريشنز يا ڪمن تي غلطي جي چڪاس کي نظرانداز ڪريو جيڪي ناڪام ٿي سگهن ٿا.
"سي پي پي"
std::ifstream فائل ("data.txt")؛
// غلطي: چيڪ نه ڪيو ته فائل ڪاميابي سان کوليو ويو آهي يا نه
“
ڪيئن درست ڪجي:
هميشه چيڪ ڪريو ته آپريشن ڪامياب ٿيو ۽ غلطين کي مناسب طريقي سان سنڀاليو.
"سي پي پي"
std::ifstream فائل ("data.txt")؛
جيڪڏهن (!فائل) {
std::cerr << "فائل کولڻ ۾ ناڪام ٿيو" << std::endl; واپسي 1; } ``` 9. سب آپٽيمل لوپ لاڳو ڪرڻ ۾ غلطي: سب آپٽيمل لوپ استعمال ڪرڻ سان پروگرام جي ڪارڪردگي ۾ گهٽتائي ٿي سگهي ٿي. ```cpp for (int i = 0; i < vec.size(); i++) { // vec[i] سان عمل // غلطي: سائيز() هر ورهاڱي تي سڏيو ويندو آهي } ``` درست ڪريو: بار بار فنڪشن ڪالن کي گهٽائي لوپ کي بهتر بڻايو. ```cpp for (std::size_t i = 0, n = vec.size(); i < n; i++) { // vec[i] سان عمل } ``` وڌيڪ اصلاح لاءِ `std::for_each` وانگر STL الگورتھم جو پڻ فائدو وٺو. ```cpp شامل آهن
std::for_each(vec.begin(), vec.end(), [](int &value) {
// قدر سان عمل
})؛
“
10. ٿريڊ هينڊلنگ ۾ غلطي
غلطي:
ڌاڙن جي غلط استعمال سان نسل جي حالتن يا تعطل جو سبب بڻجي سگهي ٿو.
"سي پي پي"
شامل آهن
// غلطي: نسل جي حالت ٿي سگھي ٿي.
}
ايس ٽي ڊي:: ٿريڊ ٽي 1 (رن)؛
ايس ٽي ڊي:: ٿريڊ ٽي 2 (رن)؛
“
ڪيئن درست ڪجي:
نسل جي حالتن ۽ ڊيڊ لاڪ کي روڪڻ لاءِ هم وقت سازي جي پرائمريز جهڙوڪ ميوٽڪس استعمال ڪريو.
"سي پي پي"
شامل آهن
ايس ٽي ڊي::ميوٽڪس ايم ٽي ايڪس؛
خالي رن () {
ايس ٽي ڊي::لاڪ_گارڊ
// هڪ عمل جيڪو نسل جي حالتن کان محفوظ آهي
}
ايس ٽي ڊي:: ٿريڊ ٽي 1 (رن)؛
ايس ٽي ڊي:: ٿريڊ ٽي 2 (رن)؛
ٽي 1.جوائن ()؛
ٽي 2.جوائن ()؛
“
نتيجو
C++ هڪ طاقتور ۽ لچڪدار پروگرامنگ ٻولي آهي، پر ان ۾ عام غلطيون پڻ ٿينديون آهن، خاص طور تي ياداشت ۽ پوائنٽر مئنيجمينٽ سان لاڳاپيل. انهن غلطين کي سمجهڻ ۽ انهن کي درست ڪرڻ جو طريقو ڄاڻڻ سان، توهان وڌيڪ قابل اعتماد ۽ ڪارآمد ايپليڪيشنون ٺاهي سگهو ٿا. ياد رکو ته هميشه ڪمپائلر پيغامن تي ڌيان ڏيو، جديد اوزار استعمال ڪريو جيڪي توهان کي محفوظ ڪوڊ لکڻ ۾ مدد ڪن ٿا، ۽ C++ پروگرامنگ جي بهترين طريقن کي سمجهڻ ۽ لاڳو ڪرڻ ۾ پنهنجي صلاحيتن کي مسلسل بهتر بڻايو.