2017-02-01 37 views
10

C++ 'dan C#' den yeni geliyorum. Ben C eşdeğer hiçbir C# using olduğunu biliyorumC++ hata oluşsa bile silme silme

void function(int n) 
{ 
    double* array = new double[n]; 

    //some work that can return or throw an exception 
    //... 

    delete[] array; 
    return; 
} 

++: İşte kodudur.

Anıların ne olacağını açıklamasını sağlamak için basit ve zarif bir yol var mı?

C++
+6

Evet var. "Akıllı işaretçiler" üzerinde bir Google araması yapın. –

+6

Veya daha iyisi ['std :: array'] (http://en.cppreference.com/w/cpp/container/array) (veya muhtemelen [' std :: vektör'] (http: //en.cppreference com/ağırlık/cPP/kap/vektör)). –

+4

Rust ve C++ 'da kullanılan RAII deyimine bakın. –

cevap

13

olarak görünecektir kod aşağıda:

#include <vector> 

void function() 
{ 
    std::vector<double> array(100); 

    //some work that can return when or throw an exception 
    //... 

    return; 
} 

gerçekten dizi elemanları başlatmak istemiyorum ve diziyi yeniden boyutlandırmak gerekmez ve yineleyicinızı gerekmez varsa, Ayrıca kullanabilirsiniz: Her iki durumda da

#include <memory> 

void function() 
{ 
    std::unique_ptr<double[]> array(new double[100]); 

    //some work that can return when or throw an exception 
    //... 

    return; 
} 

Eğer t gerekmez eğer,

Nihayet vb array[0], array[1] dizi elemanlarını erişmek o fonksiyonun dışına verilerin sahipliğini aktarmak derleme zamanında dizinin boyutunu bilmek ve boyutunu da doğrudan bir dizi nesnesi olan düşünebilir, çok büyük değil:

void function() 
{ 
    double array[100]; // uninitialized, add " = {}" to zero-initialize 

    // or: 

    std::array<double, 100> array; // ditto 

    //some work that can return when or throw an exception 
    //... 

    return; 
} 
+0

' std :: valarray ' da çözülmekte olan soruna bağlı olarak yararlı olabilir. – Andrew

+0

Sanırım ham diziler yerine std :: array 'den bahsetmek güzel olurdu. –

+0

@GuillaumeRacicot: "std :: array" boyutunun derleme zamanında bilinmesi gerekir ve OP çalışma zamanına kadar boyutu bilmez (Bu OP'de bir yorumda gizlenmiştir: "@ yanıtlayan kişiler: yanıltıcı örnek için özür dileriz, dizi boyutu derleme zamanında bilinmez ") – AndyG

10

Otomatik değişkenler kapsamı sonunda otomatik olarak tahrip nedeniyle olsun dönmek ve atmak: yanıltıcı örneğin

{ 
    double array[100]; 
    throw 1; // no memory leaked 
} 

üzgün, dizinin boyutu derleme zamanında

bilinmemektedir

Bu durumda dinamik bir diziye ihtiyacınız vardır. Dinamik bellek gibi kaynakların temizlenmesine yönelik yaygın bir çözüm, bir sınıftaki işaretçiyi (veya kaynağın türüne bağlı olarak tanıtıcı veya tanıtıcı) sarmak, başlatma sırasında kaynağı alan ve imhadan kurtulmaktır. Ardından bu sarmalayıcı türünün otomatik bir değişkenini oluşturabilirsiniz. Bu modele "Kaynak kazanımı başlatılıyor" veya kısaca RAII denir. Ancak, bir dinamik dizi için kendi RAII sarıcınızı yazmanız gerekmez, ancak bununla birlikte. Standart kütüphane şu kapsamdadır: std::vector