په C++ پروګرامینګ کې عامې غلطۍ او د هغوی د حل کولو څرنګوالی
C++ پروګرامینګ یو له خورا پیاوړو او انعطاف منونکو پروګرامینګ ژبو څخه دی. د پروسیجرل، اعتراض پر بنسټ، او عمومي پروګرامینګ ملاتړ کولو وړتیا سره، C++ په پراخه کچه په مختلفو غوښتنلیکونو کې کارول کیږي، د عملیاتي سیسټمونو څخه تر لوړ فعالیت لوبو غوښتنلیکونو پورې. په هرصورت، د هرې پروګرامینګ ژبې په څیر، C++ هم یو شمیر عام غلطۍ لري چې پراختیا کونکي، دواړه نوي او تجربه لرونکي، ډیری وختونه ورسره مخ کیږي. دا مقاله به د C++ پروګرامینګ کې ځینې عام غلطۍ په اړه بحث وکړي او د دوی د حل کولو څرنګوالي په اړه به لارښوونه چمتو کړي.
۱. د نه پیل شوي نښو کارول
تېروتنه:
یو غیر پیل شوی پوائنټر کولی شي د حافظې نامعلوم ځای ته اشاره وکړي، چې ناڅاپي چلند یا د پروګرام د خرابیدو لامل کیږي. د دې تېروتنې یوه بیلګه په لاندې ډول ده:
«cpp
int ptr; // ptr نه دی پیل شوی
ptr = 10؛ // تېروتنه: نښه کوونکی پیل شوی نه دی
"
څنګه اصلاح کول:
د کارولو دمخه پوائنټر پیل کړئ. تاسو کولی شئ دا د `nullptr` یا د یو باوري حافظې پتې سره پیل کړئ.
«cpp
int ptr = nullptr؛ // د nullptr سره پیل کړئ
د بشپړ ارزښت = ۱۰؛
ptr = & ارزښت;
ptr = 20؛ // اوس خوندي دی
"
۲. د حافظې مدیریت کې تېروتنې (د حافظې لیک)
تېروتنه:
د حافظې لیک هغه وخت رامنځته کیږي کله چې ځانګړې شوې حافظه بیا نه خپریږي. دا کولی شي یو اپلیکیشن د وخت په تیریدو سره ډیر او ډیر حافظه وکاروي، چې بالاخره د حافظې کمښت لامل کیږي.
«cpp
int ptr = نوی int[10];
// د ټاکل شوي حافظې حذف کول هیر کړئ
"
څنګه اصلاح کول:
تل ډاډ ترلاسه کړئ چې تخصیص شوي حافظه د `delete` یا `delete[]` په کارولو سره خالي کړئ، پدې پورې اړه لري چې د هغې تخصیص لپاره څه کارول شوي.
«cpp
int ptr = نوی int[10];
// د حافظې کارول…
حذف کړئ[] ptr; // وړیا تخصیص شوی حافظه
"
د حافظې مدیریت اسانه کولو لپاره د هوښیار پوائنټر کتابتون (لکه `std::unique_ptr` یا `std::shared_ptr`) وکاروئ.
«cpp
شامل دي
سټنډرد::بې ساري_پیټر ptr(نوی انټ[10])؛
// حافظه به په اتوماتيک ډول خوشې شي کله چې ptr له ساحې څخه ووځي
"
۳. د حوالو په کارولو کې تېروتنې
تېروتنه:
یو محلي متغیر ته د حوالې یا نښې بیرته راګرځول چې له ساحې څخه بهر شوي وي کولی شي غیر متوقع چلند رامینځته کړي.
«cpp
د حوالې ترلاسه کول () {
د بشپړ ارزښت = ۱۰؛
د بیرته راستنیدو ارزښت؛ // تېروتنه: سیمه ایز متغیر ته د حوالې بیرته راستنیدل
}
"
څنګه اصلاح کول:
محلي متغیراتو ته د حوالې بیرته ورکولو څخه ډډه وکړئ. پرځای یې، جامد متغیرات وکاروئ، یا لا ښه، ارزښتونه بیرته راګرځوئ، یا د شیانو کارولو په اړه فکر وکړئ.
«cpp
int ارزښت ترلاسه کړئ () {
د بشپړ ارزښت = ۱۰؛
د بیرته راستنیدو ارزښت؛ // خوندي
}
"
۴. د کمپائلر تېروتنې پیغامونه او اخطارونه له پامه وغورځوئ
تېروتنه:
پروګرام کونکي اکثرا د کمپائلر لخوا صادر شوي خطا پیغامونه او اخطارونه له پامه غورځوي، که څه هم دا پیغامونه د احتمالي غلطیو په اړه مهم معلومات چمتو کوي.
څنګه اصلاح کول:
تل د کمپائلر لخوا رامینځته شوي د خطا پیغامونه او اخطارونه وګورئ او پوه شئ. د پاک کوډ ډاډ ترلاسه کولو لپاره د لوړې کچې اخطارونه فعال کړئ.
د مثال په توګه په GCC کې، د نورو خبرتیاو د تولید لپاره د `-Wall` بیرغ وکاروئ.
"لعنت"
g++ -وال -o پروګرام main.cpp
"
۵. د آپریټر په ډیر بارولو کې تېروتنه
تېروتنه:
د غلط آپریټر ډیر بار کول کولی شي غیر متوقع چلند یا د چلولو وخت غلطیو لامل شي.
«cpp
زما ټولګي {
عامه:
د معلوماتو بشپړتیا؛
د مای کلاس آپریټر+ (ثابت زما کلاس او نور) {
ډاټا + other.data بیرته راګرځوئ؛ // تېروتنه: باید MyClass بیرته راګرځوئ
}
};
"
څنګه اصلاح کول:
ډاډ ترلاسه کړئ چې ډیر بار شوی آپریټر مناسب ډول بیرته راولي او د ټولګي تغیرات ساتي.
«cpp
زما ټولګي {
عامه:
د معلوماتو بشپړتیا؛
د مای کلاس آپریټر+ (ثابت زما کلاس او نور) {
د مای کلاس پایله؛
د پایلو ډاټا = معلومات + نور معلومات؛
د بیرته راستنیدو پایله؛ // د مای کلاس څخه یو شی بیرته راګرځوي
}
};
"
۶. د میکرو ناوړه ګټه اخیستنه
تېروتنه:
میکرو ځینې وختونه ډیر یا په غلط ډول کارول کیږي، کوم چې کولی شي د هغو غلطیو لامل شي چې د چلولو په وخت کې کشف کول یې ستونزمن وي.
«cpp
مربع (x) xx تعریف کړئ
د int پایله = مربع (۵ + ۱)؛ // تېروتنه: پایله ۵ + ۱ ۵ + ۱ ده
"
څنګه اصلاح کول:
د ښه ډول امنیت او کنټرول لپاره میکرو د ثابتو څرګندونو یا ټیمپلیټونو سره بدل کړئ.
«cpp
کېنډۍ
د T مربع (T x) {
بیرته راستنیدنه xx؛
}
د int پایله = مربع (۵ + ۱)؛ // د کارولو لپاره خوندي
"
۷. د سي سټایل دندو ناوړه ګټه اخیستنه
تېروتنه:
د C-سټایل افعالونو کارول لکه `strcpy` یا `sprintf` کوم چې د بفر اوور فلو لپاره زیان منونکي دي.
«cpp
چار src[] = "سلام، نړۍ!";
چار منزل [5]؛
strcpy(dest, src); // تېروتنه: د بفر اوور فلو
"
څنګه اصلاح کول:
د خوندي C++ افعالونو لکه `std::string` یا `std::vector` څخه کار واخلئ.
«cpp
شامل دي
std::string src = "سلام، نړۍ!";
std::string dest = src;
"
۸. د تېروتنې کشف له پامه غورځول
تېروتنه:
د I/O عملیاتو یا دندو کې د غلطیو چک کولو څخه سترګې پټې کړئ چې ناکام کیدی شي.
«cpp
د std::ifstream فایل ("data.txt")؛
// تېروتنه: دا ونه موندل شوه چې فایل په بریالیتوب سره پرانستل شو که نه
"
څنګه اصلاح کول:
تل وګورئ چې عملیات بریالي وو او غلطۍ په سمه توګه اداره کړئ.
«cpp
د std::ifstream فایل ("data.txt")؛
که (!فایل) {
std::cerr << "د فایل په خلاصولو کې پاتې راغلی" << std::endl;
1 بیرته راستانه کړئ
}
"
۹. د فرعي غوره لوپ تطبیق
تېروتنه:
د فرعي غوره لوپونو کارول کولی شي د پروګرام فعالیت کې کمښت رامینځته کړي.
«cpp
د (int i = 0; i <vec.size(); i++) لپاره {
// د vec[i] سره پروسه
// تېروتنه: اندازه() په هر تکرار کې غږول شوې
}
"
څنګه اصلاح کول:
د تکراري فعالیت زنګونو کمولو سره لوپونه غوره کړئ.
«cpp
د (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) {
// د ارزښت سره پروسه
})؛
"
۱۰. د تار په اداره کولو کې تېروتنه
تېروتنه:
د تارونو ناسمه اداره کول کولی شي د نسل شرایطو یا بندښت لامل شي.
«cpp
شامل کړئ باطل چلول() {
// تېروتنه: د نسل حالت ممکن رامنځته شي
}
std::thread t1(چلول)؛
std::thread t2(چلول)؛
"
څنګه اصلاح کول:
د نسلي شرایطو او بندښتونو د مخنیوي لپاره د همغږۍ لومړني توکي لکه میوټیکس وکاروئ.
«cpp
شامل کړئ شامل کړئ
سټنډ::میوټیکس ایم ټي ایکس؛
باطل چلول() {
د std::lock_guard قلف(mtx)؛
// یوه پروسه چې د نژادي شرایطو څخه خوندي وي
}
std::thread t1(چلول)؛
std::thread t2(چلول)؛
t1.join();
t2.join();
"
پایله
C++ یوه پیاوړې او انعطاف منونکې پروګرامینګ ژبه ده، مګر دا د عامو غلطیو سره هم مخ ده، په ځانګړې توګه د حافظې او پوائنټر مدیریت پورې اړوند. د دې غلطیو په پوهیدو او د هغوی د حل کولو څرنګوالي په پوهیدو سره، تاسو کولی شئ ډیر باوري او اغیزمن غوښتنلیکونه رامینځته کړئ . په یاد ولرئ چې تل د کمپیلر پیغامونو ته پاملرنه وکړئ، عصري وسایل وکاروئ چې تاسو سره د خوندي کوډ لیکلو کې مرسته کوي ، او په دوامداره توګه د C++ پروګرامینګ غوره کړنو په پوهیدو او پلي کولو کې خپل مهارتونه لوړ کړئ.