സി++ പ്രോഗ്രാമിംഗിലെ സാധാരണ തെറ്റുകളും അവ എങ്ങനെ പരിഹരിക്കാം എന്നതും
സി++ പ്രോഗ്രാമിംഗ് ഏറ്റവും ശക്തവും വഴക്കമുള്ളതുമായ പ്രോഗ്രാമിംഗ് ഭാഷകളിൽ ഒന്നാണ്. പ്രൊസീജറൽ, ഒബ്ജക്റ്റ്-ഓറിയന്റഡ്, ജെനറിക് പ്രോഗ്രാമിംഗിനെ പിന്തുണയ്ക്കാനുള്ള കഴിവ് ഉള്ളതിനാൽ, ഓപ്പറേറ്റിംഗ് സിസ്റ്റങ്ങൾ മുതൽ ഉയർന്ന പ്രകടനമുള്ള ഗെയിമിംഗ് ആപ്ലിക്കേഷനുകൾ വരെയുള്ള വിവിധ ആപ്ലിക്കേഷനുകളിൽ സി++ വ്യാപകമായി ഉപയോഗിക്കുന്നു. എന്നിരുന്നാലും, ഏതൊരു പ്രോഗ്രാമിംഗ് ഭാഷയെയും പോലെ, പുതിയതും പരിചയസമ്പന്നരുമായ ഡെവലപ്പർമാർ പലപ്പോഴും നേരിടുന്ന നിരവധി സാധാരണ പിശകുകൾ സി++-ലുണ്ട്. ഈ ലേഖനം സി++ പ്രോഗ്രാമിംഗിലെ ചില സാധാരണ പിശകുകൾ ചർച്ച ചെയ്യുകയും അവ എങ്ങനെ പരിഹരിക്കാമെന്നതിനെക്കുറിച്ചുള്ള മാർഗ്ഗനിർദ്ദേശം നൽകുകയും ചെയ്യും.
1. ഇനിഷ്യലൈസ് ചെയ്യാത്ത പോയിന്ററുകൾ ഉപയോഗിക്കുന്നു
പിശക്:
ഇനിഷ്യലൈസ് ചെയ്യാത്ത ഒരു പോയിന്റർ ഒരു അജ്ഞാത മെമ്മറി ലൊക്കേഷനിലേക്ക് പോയിന്റ് ചെയ്തേക്കാം, ഇത് അപ്രതീക്ഷിത പെരുമാറ്റത്തിനോ പ്രോഗ്രാം ക്രാഷിനോ കാരണമാകും. ഈ പിശകിന്റെ ഒരു ഉദാഹരണം ഇപ്രകാരമാണ്:
"സിപിപി"
int ptr; // ptr ഇനീഷ്യലൈസ് ചെയ്തിട്ടില്ല
ptr = 10; // പിശക്: പോയിന്റർ ഇനീഷ്യലൈസ് ചെയ്തിട്ടില്ല
""
എങ്ങനെ പരിഹരിക്കാം:
ഉപയോഗിക്കുന്നതിന് മുമ്പ് പോയിന്റർ ഇനീഷ്യലൈസ് ചെയ്യുക. `nullptr` ഉപയോഗിച്ചോ സാധുവായ ഒരു മെമ്മറി വിലാസം ഉപയോഗിച്ചോ നിങ്ങൾക്ക് ഇത് ഇനീഷ്യലൈസ് ചെയ്യാം.
"സിപിപി"
int ptr = nullptr; // nullptr ഉപയോഗിച്ച് ഇനീഷ്യലൈസ് ചെയ്യുക
int മൂല്യം = 10;
ptr = &മൂല്യം;
ptr = 20; // ഇപ്പോൾ സുരക്ഷിതം
""
2. മെമ്മറി മാനേജ്മെന്റിലെ പിശകുകൾ (മെമ്മറി ലീക്ക്)
പിശക്:
അനുവദിച്ച മെമ്മറി വീണ്ടും റിലീസ് ചെയ്യാത്തപ്പോൾ മെമ്മറി ചോർച്ച സംഭവിക്കുന്നു. ഇത് കാലക്രമേണ ഒരു ആപ്ലിക്കേഷന് കൂടുതൽ കൂടുതൽ മെമ്മറി ഉപയോഗിക്കുന്നതിന് കാരണമാകും, ഇത് ഒടുവിൽ മെമ്മറി ക്ഷാമത്തിലേക്ക് നയിച്ചേക്കാം.
"സിപിപി"
int ptr = പുതിയ int[10];
// അനുവദിച്ച മെമ്മറി ഇല്ലാതാക്കാൻ മറക്കുക
""
എങ്ങനെ പരിഹരിക്കാം:
അനുവദിച്ച മെമ്മറി എന്ത് ഉപയോഗിച്ചു എന്നതിനെ ആശ്രയിച്ച്, `delete` അല്ലെങ്കിൽ `delete[]` ഉപയോഗിച്ച് എപ്പോഴും സ്വതന്ത്രമാക്കുന്നത് ഉറപ്പാക്കുക.
"സിപിപി"
int ptr = പുതിയ int[10];
// മെമ്മറി ഉപയോഗം…
ഡിലീറ്റ്[] പി.ടി.ആർ; // സൌജന്യമായി അനുവദിച്ച മെമ്മറി
""
മെമ്മറി മാനേജ്മെന്റ് എളുപ്പമാക്കാൻ ഒരു സ്മാർട്ട് പോയിന്റേഴ്സ് ലൈബ്രറി (`std::unique_ptr` അല്ലെങ്കിൽ `std::shared_ptr` പോലുള്ളവ) ഉപയോഗിക്കുക.
"സിപിപി"
ഉൾപ്പെടുന്നു
std::unique_ptr
// ptr സ്കോപ്പിൽ നിന്ന് പുറത്തുകടക്കുമ്പോൾ മെമ്മറി യാന്ത്രികമായി റിലീസ് ചെയ്യപ്പെടും.
""
3. റഫറൻസുകൾ ഉപയോഗിക്കുന്നതിലെ പിഴവുകൾ
പിശക്:
പരിധിക്ക് പുറത്തായ ഒരു ലോക്കൽ വേരിയബിളിലേക്ക് ഒരു റഫറൻസോ പോയിന്ററോ തിരികെ നൽകുന്നത് അപ്രതീക്ഷിത പെരുമാറ്റത്തിന് കാരണമാകും.
"സിപിപി"
ഇന്റ് & റഫറൻസ് നേടുക() {
int മൂല്യം = 10;
റിട്ടേൺ മൂല്യം; // പിശക്: ഒരു ലോക്കൽ വേരിയബിളിലേക്ക് ഒരു റഫറൻസ് തിരികെ നൽകുന്നു
}
""
എങ്ങനെ പരിഹരിക്കാം:
ലോക്കൽ വേരിയബിളുകളിലേക്ക് റഫറൻസുകൾ തിരികെ നൽകുന്നത് ഒഴിവാക്കുക. പകരം, സ്റ്റാറ്റിക് വേരിയബിളുകൾ ഉപയോഗിക്കുക, അല്ലെങ്കിൽ അതിലും മികച്ചത്, മൂല്യങ്ങൾ തിരികെ നൽകുക, അല്ലെങ്കിൽ ഒബ്ജക്റ്റുകൾ ഉപയോഗിക്കുന്നത് പരിഗണിക്കുക.
"സിപിപി"
ഇന്റ് getValue() {
int മൂല്യം = 10;
റിട്ടേൺ മൂല്യം; // സുരക്ഷിതം
}
""
4. കംപൈലർ പിശക് സന്ദേശങ്ങളും മുന്നറിയിപ്പുകളും അവഗണിക്കുക.
പിശക്:
കംപൈലർ നൽകുന്ന പിശക് സന്ദേശങ്ങളും മുന്നറിയിപ്പുകളും പ്രോഗ്രാമർമാർ പലപ്പോഴും അവഗണിക്കുന്നു, എന്നിരുന്നാലും ഈ സന്ദേശങ്ങൾ സാധ്യമായ പിശകുകളെക്കുറിച്ചുള്ള പ്രധാന വിവരങ്ങൾ നൽകുന്നു.
എങ്ങനെ പരിഹരിക്കാം:
കംപൈലർ സൃഷ്ടിക്കുന്ന പിശക് സന്ദേശങ്ങളും മുന്നറിയിപ്പുകളും എപ്പോഴും പരിശോധിച്ച് മനസ്സിലാക്കുക. ക്ലീനർ കോഡ് ഉറപ്പാക്കാൻ ഉയർന്ന തലത്തിലുള്ള മുന്നറിയിപ്പുകൾ പ്രാപ്തമാക്കുക.
ഉദാഹരണത്തിന് ജിസിസിയിൽ, കൂടുതൽ മുന്നറിയിപ്പുകൾ സൃഷ്ടിക്കാൻ `-Wall` ഫ്ലാഗ് ഉപയോഗിക്കുക.
"`ബാഷ്
g++ -വാൾ -o പ്രോഗ്രാം main.cpp
""
5. ഓപ്പറേറ്റർ ഓവർലോഡിംഗിൽ പിശക്
പിശക്:
തെറ്റായ ഓപ്പറേറ്റർ ഓവർലോഡിംഗ് അപ്രതീക്ഷിത പെരുമാറ്റത്തിനോ റൺടൈം പിശകുകൾക്കോ കാരണമാകും.
"സിപിപി"
ക്ലാസ് മൈക്ലാസ് {
പൊതുജനങ്ങൾ:
ഇന്റ് ഡാറ്റ;
മൈക്ലാസ് ഓപ്പറേറ്റർ+ (കോൺസ്റ്റ് മൈക്ലാസ് & മറ്റുള്ളവ) {
ഡാറ്റ + other.data തിരികെ നൽകുക; // പിശക്: MyClass തിരികെ നൽകണം
}
};
""
എങ്ങനെ പരിഹരിക്കാം:
ഓവർലോഡ് ചെയ്ത ഓപ്പറേറ്റർ ഉചിതമായ തരം തിരികെ നൽകുന്നുണ്ടെന്നും ക്ലാസിന്റെ മാറ്റമില്ലാത്തവ സംരക്ഷിക്കുന്നുണ്ടെന്നും ഉറപ്പാക്കുക.
"സിപിപി"
ക്ലാസ് മൈക്ലാസ് {
പൊതുജനങ്ങൾ:
ഇന്റ് ഡാറ്റ;
മൈക്ലാസ് ഓപ്പറേറ്റർ+ (കോൺസ്റ്റ് മൈക്ലാസ് & മറ്റുള്ളവ) {
മൈക്ലാസ് ഫലം;
ഫലം.ഡാറ്റ = ഡാറ്റ + മറ്റ്.ഡാറ്റ;
ഫലം തിരികെ നൽകുന്നു; // MyClass-ൽ നിന്ന് ഒരു ഒബ്ജക്റ്റ് തിരികെ നൽകുന്നു
}
};
""
6. മാക്രോകളുടെ ദുരുപയോഗം
പിശക്:
മാക്രോകൾ ചിലപ്പോൾ അമിതമായോ തെറ്റായോ ഉപയോഗിക്കപ്പെടുന്നു, ഇത് റൺടൈമിൽ കണ്ടെത്താൻ പ്രയാസമുള്ള പിശകുകളിലേക്ക് നയിച്ചേക്കാം.
"സിപിപി"
SQUARE(x) xx നിർവചിക്കുക
int ഫലം = SQUARE(5 + 1); // പിശക്: ഫലം 5 + 1 5 + 1 ആണ്
""
എങ്ങനെ പരിഹരിക്കാം:
മികച്ച ടൈപ്പ് സുരക്ഷയ്ക്കും നിയന്ത്രണത്തിനുമായി മാക്രോകൾ സ്ഥിരമായ എക്സ്പ്രഷനുകളോ ടെംപ്ലേറ്റുകളോ ഉപയോഗിച്ച് മാറ്റിസ്ഥാപിക്കുക.
"സിപിപി"
ടെംപ്ലേറ്റ്
ടി ചതുരം(ടി x) {
റിട്ടേൺ xx;
}
int ഫലം = ചതുരം(5 + 1); // ഉപയോഗിക്കാൻ സുരക്ഷിതം
""
7. സി-സ്റ്റൈൽ ഫംഗ്ഷനുകളുടെ ദുരുപയോഗം
പിശക്:
ബഫർ ഓവർഫ്ലോയ്ക്ക് സാധ്യതയുള്ള `strcpy` അല്ലെങ്കിൽ `sprintf` പോലുള്ള സി-സ്റ്റൈൽ ഫംഗ്ഷനുകൾ ഉപയോഗിക്കുന്നു.
"സിപിപി"
char src[] = "ഹലോ, വേൾഡ്!";
ചാർ ഡെസ്റ്റ്[5];
strcpy(dest, src); // പിശക്: ബഫർ ഓവർഫ്ലോ
""
എങ്ങനെ പരിഹരിക്കാം:
`std::string` അല്ലെങ്കിൽ `std::vector` പോലുള്ള സുരക്ഷിതമായ C++ ഫംഗ്ഷനുകൾ ഉപയോഗിക്കുക.
"സിപിപി"
ഉൾപ്പെടുന്നു
std::string src = “ഹലോ, വേൾഡ്!”;
std::സ്ട്രിംഗ് ഡെസ്റ്റ് = src;
""
8. പിശക് കണ്ടെത്തൽ അവഗണിക്കൽ
പിശക്:
പരാജയപ്പെടാൻ സാധ്യതയുള്ള I/O പ്രവർത്തനങ്ങളിലോ ഫംഗ്ഷനുകളിലോ പിശക് പരിശോധന അവഗണിക്കുക.
"സിപിപി"
std::ifstream ഫയൽ(“data.txt”);
// പിശക്: ഫയൽ വിജയകരമായി തുറന്നിട്ടുണ്ടോ എന്ന് പരിശോധിച്ചില്ല.
""
എങ്ങനെ പരിഹരിക്കാം:
പ്രവർത്തനം വിജയകരമാണോ എന്ന് എപ്പോഴും പരിശോധിക്കുകയും പിശകുകൾ ഉചിതമായി കൈകാര്യം ചെയ്യുകയും ചെയ്യുക.
"സിപിപി"
std::ifstream ഫയൽ(“data.txt”);
(!ഫയൽ) { ആണെങ്കിൽ
std::cerr << "ഫയൽ തുറക്കുന്നതിൽ പരാജയപ്പെട്ടു" << std::endl; return 1; } ``` 9. സബ്ഒപ്റ്റിമൽ ലൂപ്പ് ഇംപ്ലിമെന്റേഷൻ പിശക്: ഒരു സബ്ഒപ്റ്റിമൽ ലൂപ്പ് ഉപയോഗിക്കുന്നത് പ്രോഗ്രാം പ്രകടനത്തിൽ കുറവുണ്ടാക്കും. ```cpp for (int i = 0; i < vec.size(); i++) { // vec[i] ഉള്ള പ്രോസസ്സ് // പിശക്: size() ഓരോ ആവർത്തനത്തിലും വിളിക്കുന്നു } ``` പരിഹരിക്കുക: ആവർത്തിച്ചുള്ള ഫംഗ്ഷൻ കോളുകൾ കുറച്ചുകൊണ്ട് ലൂപ്പ് ഒപ്റ്റിമൈസ് ചെയ്യുക. ``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. ത്രെഡ് കൈകാര്യം ചെയ്യുന്നതിൽ പിശക്
പിശക്:
നൂലുകൾ തെറ്റായി കൈകാര്യം ചെയ്യുന്നത് റേസ് സാഹചര്യങ്ങളിലേക്കോ സ്തംഭനത്തിലേക്കോ നയിച്ചേക്കാം.
"സിപിപി"
ഉൾപ്പെടുന്നു
// പിശക്: റേസ് അവസ്ഥ ഉണ്ടാകാം
}
std::ത്രെഡ് t1(റൺ);
std::ത്രെഡ് t2(റൺ);
""
എങ്ങനെ പരിഹരിക്കാം:
റേസ് അവസ്ഥകളും ഡെഡ്ലോക്കുകളും തടയുന്നതിന് മ്യൂട്ടക്സുകൾ പോലുള്ള സിൻക്രൊണൈസേഷൻ പ്രിമിറ്റീവുകൾ ഉപയോഗിക്കുക.
"സിപിപി"
ഉൾപ്പെടുന്നു
സ്റ്റാൻഡേർഡ്::മ്യൂട്ടക്സ് എംടിഎക്സ്;
അസാധുവായ റൺ() {
സ്റ്റാൻഡേർഡ്::ലോക്ക്_ഗാർഡ്
// വംശീയ സാഹചര്യങ്ങളിൽ നിന്ന് സുരക്ഷിതമായ ഒരു പ്രക്രിയ
}
std::ത്രെഡ് t1(റൺ);
std::ത്രെഡ് t2(റൺ);
t1.ചേരുക();
t2.ചേരുക();
""
ഉപസംഹാരം
C++ ശക്തവും വഴക്കമുള്ളതുമായ ഒരു പ്രോഗ്രാമിംഗ് ഭാഷയാണ്, പക്ഷേ ഇത് സാധാരണ പിശകുകൾക്ക് സാധ്യതയുണ്ട്, പ്രത്യേകിച്ച് മെമ്മറി, പോയിന്റർ മാനേജ്മെന്റ് എന്നിവയുമായി ബന്ധപ്പെട്ടത്. ഈ പിശകുകൾ മനസ്സിലാക്കുകയും അവ എങ്ങനെ പരിഹരിക്കാമെന്ന് അറിയുകയും ചെയ്യുന്നതിലൂടെ, നിങ്ങൾക്ക് കൂടുതൽ വിശ്വസനീയവും കാര്യക്ഷമവുമായ ആപ്ലിക്കേഷനുകൾ വികസിപ്പിക്കാൻ കഴിയും. കംപൈലർ സന്ദേശങ്ങളിൽ എപ്പോഴും ശ്രദ്ധ ചെലുത്താനും സുരക്ഷിതമായ കോഡ് എഴുതാൻ സഹായിക്കുന്ന ആധുനിക ഉപകരണങ്ങൾ ഉപയോഗിക്കാനും C++ പ്രോഗ്രാമിംഗ് മികച്ച രീതികൾ മനസ്സിലാക്കുന്നതിലും പ്രയോഗിക്കുന്നതിലും നിങ്ങളുടെ കഴിവുകൾ നിരന്തരം വികസിപ്പിക്കാനും ഓർമ്മിക്കുക.