C++ proqramlaşdırmasında ümumi səhvlər və onları necə düzəltmək olar

C++ Proqramlaşdırmasında Ümumi Səhvlər və Onları Necə Düzəltmək Olar

C++ proqramlaşdırma dili ən güclü və çevik proqramlaşdırma dillərindən biridir. Prosedural, obyekt yönümlü və ümumi proqramlaşdırmanı dəstəkləmək qabiliyyətinə malik C++ əməliyyat sistemlərindən tutmuş yüksək performanslı oyun tətbiqlərinə qədər müxtəlif tətbiqlərdə geniş istifadə olunur. Bununla belə, hər hansı bir proqramlaşdırma dili kimi, C++ da həm yeni, həm də təcrübəli tərtibatçıların tez-tez rastlaşdıqları bir sıra ümumi səhvlərə malikdir. Bu məqalədə C++ proqramlaşdırmasındakı bəzi ümumi səhvlər müzakirə ediləcək və onları necə düzəltmək barədə rəhbərlik veriləcək.

1. Başlanğıclaşdırılmamış Göstəricilərdən İstifadə

Xəta:
Başlanğıclaşdırılmamış göstərici naməlum yaddaş yerinə işarə edə bilər və bu da gözlənilməz davranışa və ya proqram qəzasına səbəb ola bilər. Bu xətanın nümunəsi aşağıdakı kimidir:

“`cpp
int ptr; // ptr başlanğıclaşdırılmayıb
ptr = 10; // Xəta: göstərici başlatılmadı
""

Necə düzəltmək olar:
İstifadə etməzdən əvvəl göstəricini işə salın. Onu `nullptr` ilə və ya etibarlı yaddaş ünvanı ilə işə sala bilərsiniz.

“`cpp
int ptr = nullptr; // nullptr ilə başlanğıc edin
int dəyəri = 10;
ptr = &dəyər;
ptr = 20; // İndi təhlükəsizdir
""

2. Yaddaş İdarəetməsində Xəta (Yaddaş Sızması)

Xəta:
Ayrılmış yaddaş yenidən boşaldılmadıqda yaddaş sızması baş verir. Bu, tətbiqin zamanla daha çox yaddaş istifadə etməsinə və nəticədə yaddaş çatışmazlığına səbəb ola bilər.

“`cpp
int ptr = yeni int[10];
// Ayrılmış yaddaşı silməyi unut
""

Necə düzəltmək olar:
Ayrılmış yaddaşın nədən istifadə edildiyindən asılı olaraq, həmişə `delete` və ya `delete[]` əmrlərindən istifadə edərək boşaltdığınızdan əmin olun.

“`cpp
int ptr = yeni int[10];
// Yaddaş istifadəsi…
silmək[] ptr; // Boş ayrılmış yaddaş
""

Yaddaşın idarə olunmasını asanlaşdırmaq üçün ağıllı göstəricilər kitabxanasından (məsələn, `std::unique_ptr` və ya `std::shared_ptr`) istifadə edin.

“`cpp
daxil

std::unique_ptr ptr(new int[10]);
// ptr scope-dan çıxdıqda yaddaş avtomatik olaraq boşalacaq
""

3. İstinadlardan İstifadədə Səhvlər

Xəta:
Əhatə dairəsindən kənara çıxmış lokal dəyişənə istinad və ya göstərici qaytarmaq gözlənilməz davranışa səbəb ola bilər.

“`cpp
int& getReference() {
int dəyəri = 10;
qaytarılan dəyər; // Xəta: yerli dəyişənə istinad qaytarılır
}
""

Necə düzəltmək olar:
Yerli dəyişənlərə istinadları qaytarmaqdan çəkinin. Bunun əvəzinə statik dəyişənlərdən istifadə edin və ya daha yaxşısı, dəyərlər qaytarın və ya obyektlərdən istifadə etməyi düşünün.

“`cpp
int getValue() {
int dəyəri = 10;
qaytarılan dəyər; // Daha Təhlükəsiz
}
""

4. Kompilyator Xəta Mesajlarını və Xəbərdarlıqlarını İmtina Edin

Xəta:
Proqramçılar çox vaxt kompilyator tərəfindən verilən səhv mesajlarını və xəbərdarlıqları görməzdən gəlirlər, baxmayaraq ki, bu mesajlar potensial səhvlər haqqında vacib məlumat verir.

Necə düzəltmək olar:
Kompilyator tərəfindən yaradılan səhv mesajlarını və xəbərdarlıqları həmişə yoxlayın və başa düşün. Daha təmiz kodu təmin etmək üçün yüksək səviyyəli xəbərdarlıqları aktivləşdirin.

Məsələn, GCC-də daha çox xəbərdarlıq yaratmaq üçün `-Wall` bayrağından istifadə edin.

“`bash
g++ -Divar -o proqramı main.cpp
""

5. Operatorun Həddindən Artıq Yüklənməsində Xəta

Xəta:
Yanlış operator həddindən artıq yüklənməsi gözlənilməz davranışa və ya icra zamanı səhvlərə səbəb ola bilər.

“`cpp
sinif MyClass {
ictimai:
int məlumatları;
MyClass operatoru+ (const MyClass& other) {
məlumatları qaytarır + other.data; // Xəta: MyClass-ı qaytarmalıdır
}
};
""

Necə düzəltmək olar:
Həddindən artıq yüklənmiş operatorun müvafiq tipi qaytardığından və sinfin invariantlarını qoruduğundan əmin olun.

“`cpp
sinif MyClass {
ictimai:
int məlumatları;
MyClass operatoru+ (const MyClass& other) {
MyClass nəticəsi;
nəticə.məlumat = məlumat + digər.məlumat;
nəticəni qaytarır; // MyClass-dan obyekt qaytarır
}
};
""

6. Makroslardan sui-istifadə

Xəta:
Makrolar bəzən həddindən artıq və ya səhv istifadə olunur ki, bu da iş zamanı aşkarlanması çətin olan səhvlərə səbəb ola bilər.

“`cpp
KVADRAT(x) xx-i təyin edin

int result = SQUARE(5 + 1); // Xəta: nəticə 5 + 1 5 + 1-dir
""

Necə düzəltmək olar:
Daha yaxşı təhlükəsizlik və nəzarət üçün makroları sabit ifadələr və ya şablonlarla əvəz edin.

“`cpp
şablon
T kvadratı(T x) {
qaytar xx;
}

int nəticə = kvadrat(5 + 1); // İstifadəsi təhlükəsizdir
""

7. C tipli funksiyalardan sui-istifadə

Xəta:
Bufer daşmasına qarşı həssas olan `strcpy` və ya `sprintf` kimi C-stil funksiyalarından istifadə.

“`cpp
char src[] = "Salam, Dünya!";
char dest[5];
strcpy(dest, src); // Xəta: bufer daşması
""

Necə düzəltmək olar:
`std::string` və ya `std::vector` kimi daha təhlükəsiz C++ funksiyalarından istifadə edin.

“`cpp
daxil
std::string src = “Salam, Dünya!”;
std::string dest = src;
""

8. Xəta Aşkarlamasını İmtina Etmək

Xəta:
Uğursuz ola biləcək giriş/çıxış əməliyyatları və ya funksiyaları zamanı səhv yoxlamasını nəzərə almayın.

“`cpp
std::ifstream faylı(“data.txt”);
// Xəta: faylın uğurla açılıb-açılmadığını yoxlamadı
""

Necə düzəltmək olar:
Əməliyyatın uğurlu olub olmadığını həmişə yoxlayın və səhvləri düzgün şəkildə idarə edin.

“`cpp
std::ifstream faylı(“data.txt”);
əgər (!fayl) {
std::cerr << “Fayl açılmadı” << std::endl;
1 qaytarır;
}
""

9. Suboptimal Döngü Tətbiqi

Xəta:
Suboptimal döngələrdən istifadə proqram performansının azalmasına səbəb ola bilər.

“`cpp
üçün (int i = 0; i < vec.size(); i++) {
// vec[i] ilə proses
// Xəta: size() hər iterasiyada çağırılır
}
""

Necə düzəltmək olar:
Təkrarlanan funksiya çağırışlarını azaltmaqla döngələri optimallaşdırın.

“`cpp
üçün (std::size_t i = 0, n = vec.size(); i < n; i++) {
// vec[i] ilə proses
}
""

Əlavə optimallaşdırma üçün `std::for_each` kimi STL alqoritmlərindən də yararlanın.

“`cpp
daxil
std::for_each(vec.begin(), vec.end(), [](int &dəyər) {
// Dəyərli proses
});
""

10. Mövzunun İşlənməsində Xəta

Xəta:
İplərin düzgün idarə edilməməsi yarış şəraitinə və ya çıxılmaz vəziyyətə səbəb ola bilər.

“`cpp
boşluğu daxil edin run() {
// Xəta: Yarış şərti yarana bilər
}

std::thread t1(run);
std::thread t2(run);
""

Necə düzəltmək olar:
Yarış şərtlərinin və çıxılmaz vəziyyətlərin qarşısını almaq üçün mutekslər kimi sinxronizasiya primitivlərindən istifadə edin.

“`cpp
daxil etmək daxil etmək

std::mutex mtx;

boşluq run() {
std::lock_guard kilidi(mtx);
// Yarış şəraitindən təhlükəsiz bir proses
}

std::thread t1(run);
std::thread t2(run);

t1.join();
t2.join();
""

Nəticə

C++ güclü və çevik bir proqramlaşdırma dilidir, lakin eyni zamanda, xüsusən də yaddaş və göstərici idarəetməsi ilə əlaqəli ümumi səhvlərə meyllidir. Bu səhvləri anlamaqla və onları necə düzəldəcəyinizi bilməklə daha etibarlı və səmərəli tətbiqlər hazırlaya bilərsiniz . Kompilyator mesajlarına həmişə diqqət yetirməyi, təhlükəsiz kod yazmağınıza kömək edən müasir vasitələrdən istifadə etməyi və C++ proqramlaşdırmasının ən yaxşı təcrübələrini anlamaq və tətbiq etmək bacarıqlarınızı daim təkmilləşdirməyi unutmayın.

Şərh yazın