disket.net Beta
Konu Listesine Dön

C++'ta vektörlerle bellek sızıntısı yaşıyorum, delete[] kullanmama rağmen çözemedim

Programlama Açılış: 02.08.2026 19:26 2 Görüntülenme
Selam dostlar, uzun zamandır C++ ile uğraşıyorum ama şu bellek yönetimi işini bir türlü tam oturtamadım. Şöyle bir durum var: Dinamik olarak oluşturduğum bir int dizisini std::vector<int> içinde tutuyorum ve program kapanırken delete[] ile silmeye çalışıyorum. Ama Valgrind hâlâ 'definitely lost: 4 bytes' diye rapor veriyor. Kodum şöyle:

```cpp
#include <vector>
#include <iostream>

int main() {
std::vector<int*> vec;
int* ptr = new int(42);
vec.push_back(ptr);
// ... işlemler ...
delete[] ptr; // Burada delete[] kullanıyorum
return 0;
}
```

Ayrıca vector'ün kendisini de temizlemem gerekiyor mu? Yoksa destructor otomatik olarak hallediyor mu? Kafam karıştı, çünkü bazı kaynaklar 'new int' için 'delete' kullanın derken, bazıları 'delete[]' diyor. Hangisi doğru? Bir de vector'ün içindeki pointer'ları tek tek silmek zorunda mıyım? Teşekkürler şimdiden.

Cevaplar (2)

Merhaba, öncelikle şunu netleştirelim: `new int` ile ayırdığın belleği `delete[]` ile silmek yanlış, çünkü `new[]` ile ayrılan diziler için `delete[]` kullanılır. Tek bir int için `new int` kullandıysan `delete` kullanmalısın. Ama asıl mesele şu: `std::vector<int*>` içinde tuttuğun pointer'ların her birini manuel olarak silmen gerekiyor, çünkü vector sadece pointer'ları tutar, işaret ettikleri nesneleri silmez. Yani `vec` destructor'ı çağrıldığında içindeki pointer'lar silinir ama `new` ile ayrılan int'ler silinmez, bu da bellek sızıntısına yol açar.

Önerim şu: `std::vector<std::unique_ptr<int>>` kullan. Bu sayede vector yok edilirken unique_ptr'ler otomatik olarak `delete` çağırır. Ya da `std::vector<int>` kullan, değerleri doğrudan sakla. Ama illa pointer tutacaksan, vector'ü yok etmeden önce döngüyle her elemanı `delete` et. Ayrıca `delete[]` konusunda: `new int` ile ayrılan tek bir nesneyi `delete[]` ile silmek tanımsız davranıştır (undefined behavior). Bu yüzden Valgrind'in raporu doğru olabilir, çünkü `delete[]` yanlış çağrılmış. Kodunu şöyle düzeltebilirsin:

```cpp
for (int* p : vec) {
delete p; // her bir int'i sil
}
```

Ve `delete[]` yerine `delete` kullan. Kolay gelsin!



Kodum şöyle:

```cpp
#include <vector>
#include <iostream>

int main() {
std::vector<int*> vec;
int* ptr = new int(42);
vec.push_back(ptr);
// ... işlemler ...
delete[] ptr; // Burada delete[] kullanıyorum
return 0;
}
```

Ayrıca vector'ün kendisini de temizlemem gerekiyor mu? Yoksa destructor otomatik olarak hallediyor mu? Kafam karıştı, çünkü bazı kaynaklar 'new int' için 'delete' kullanın derken, bazıları 'delete[]' diyor. Hangisi doğru? Bir de vector'ün içindeki pointer'ları tek tek silmek zorunda mıyım? Teşekkürler şimdiden.



Evet dostum, cpubender32'nin dediği gibi, `new int` için `delete` kullanmalısın, `delete[]` değil. `delete[]` yalnızca `new[]` ile ayrılan diziler için geçerli. Senin durumunda `new int(42)` tek bir int oluşturuyor, bu yüzden `delete ptr;` yeterli. Ayrıca vector'ün destructor'ı otomatik olarak çağrılır ve içindeki elemanların (pointer'ların) kendilerini siler, ama işaret ettikleri nesneleri silmez. Bu yüzden her pointer'ı manuel olarak `delete` etmen gerekiyor. Bunu yapmanın en temiz yolu, vector'ü kullanmadan önce bir döngü ile silmek veya akıllı pointer kullanmak. Ben genelde `std::vector<std::unique_ptr<int>>` kullanıyorum, çünkü hem bellek yönetimini otomatikleştiriyor hem de exception safety sağlıyor. Ayrıca Valgrind'in 'definitely lost: 4 bytes' demesi, tam olarak senin `delete[]` yanlış kullanımından kaynaklanıyor olabilir. Denedikten sonra sonucu yaz, merak ettim. Çözüldüyse buraya da yaz ki başkaları faydalansın.

Bu konuya cevap yazabilmek için retro topluluğumuza üye olmalı veya giriş yapmalısınız.

İlgili Konular & Benzer Paylaşımlar

Turbo Pascal 7.0'da Grafik Modda Türkçe Karakter Sorunu (Çözüm Arıyorum) Kategori: Programlama
Windows 98'de Turbo Pascal 7.0 ile fare sürücüsü (mouse driver) nasıl yüklenir? Kategori: Programlama
PIC16F628A ile C'de RF alıcı-verici protokolü: Manchester kodlama sorunu Kategori: Programlama