2013-08-02 26 views
7

Dinamik olarak ayrılmış bir diziyi tüm öğeler arasında döngü yaparak ve her birinde delete numaralı telefonu arayarak silmek istiyorum.
(Bunu yapıyorum çünkü bir diziyi başka bir konuma taşımak, yani, orijinal diziyi kopyalamak ve sonra silmek, ancak her öğeyi eşzamanlı olarak kopyalamak ve bunlara delete'u çağırmaktan 2 kat daha fazla zaman alacağım bireysel olarak)Dinamik bir dizi öğelerinin tek tek silinmesi

Ben şu kod:

int main() 
{ 
    int *n=new int[2]; 
    delete n; 
    delete (n+1); 
} 

Ama bir segmentasyon hatası ben bu çalıştırmak her zaman alıyorum ....

bu gayet iyi çalışıyor, ne kadar -:

int main() 
{ 
    int *n=new int[1]; 
    delete n; 
}  

Öyleyse, tahminim silme, bir şekilde tek bir öğe yerine tüm diziyi siliyor olmasıdır!

Tahmininizin doğru olup olmadığını ve herkesin olası bir çözüm önerisi varsa, lütfen bunu açıklayabilir misiniz?

Ben Öğeleri tek tek silemezsiniz Ubuntu 13.04

+0

Bunu yapmanın en kolay yolu, dinamik diziler yerine C++ standart kapsayıcılarını (bu örnekte std :: vector) kullanmaktır ve yalnızca kabın silme yöntemini kullanır. Ama öte yandan, ne yapmaya çalışıyorsun? Neden öğeleri birer birer silmek istiyorsun? – Manu343726

+0

Aslında, kendime ait başka bir vektör benzeri konteyner yapmaya çalışıyordum. [Sadece std :: vectors 'başlık altında çalışmak nasıl daha iyi anlamak için) C++ öğrenmek için –

+0

@Ammol? tamam. Yani senin sorunun vektörün yıkıcısı hakkında mı? Bu yüzden bir öğeyi tek tek silmeye mi çalışıyorsun? – Manu343726

cevap

7

GCC 4.7.3 kullanıyorum. new [] ile ayırdığınızda, delete [] ile ayrılmanız gerekir. Burada yaptığınız şey doğru değil:

int *n=new int[1]; 
delete n; // ERROR: should be delete [] 

doğru değil. tanımsız davranışı çağırıyorsunuz. Saf bir şansla çalışıyor gibi görünüyor ve güvenilemez. Geçici bir çözüm gelince

, sorunun ne belli değil, ancak dizi "taşımak" istiyorsanız, sadece farklı bir pointer da verebilirmiş:

int* n=new int[2]; 
... 
int* m = n; 
n = nullptr; 
.... 
delete [] m; 
+0

Evet, ancak sil (n + 1) 'de neyin yanlış olduğu? Sadece yeni ile ayrılmış olan bellek blokları değil mi? –

+0

@AnmolSinghJaggi C++ standardına izin verilmiyor. – juanchopanza

+3

@AnmolSinghJaggi noktası, 'yeni [] 'bir dizi ayırır. Dizinin tek elemanlarını ayırmak anlamlı değildir. OS muhtemelen onlarla ne yapabilir? – juanchopanza

1

silmek için
int *n=new int[2]; 

kullanımı

delete [] n; 

kod

Yeni [] kullanarak ayırdığınız zaman yanlış
delete n; 

yanlıştır.