2012-08-12 26 views
8

Eğer doğru bir şekilde anlarsam, bir paylaşımlı_ptr (boost, tr1, std, neyse), yeni ayrılmış bir nesnenin bir işaretçisi ile başlatıldığında, paylaşımlı_ptr kurucusu, işaretçi için bir referans sayımını tutmak için az miktarda bellek ayırır. yönetir. Bu ayırma başarısız olursa ne olur? Aşağıdaki kodda: Bir shared_ptr'nin yapıcısı başarısız olursa ne olur?

class my_class {}; 
void my_func(shared_ptr<my_class> arg); 

int main(int argc, char* argv[]) 
{ 
    my_func(shared_ptr<my_class>(new my_class())); 
    return 0; 
} 

...

my_class nesne Shared_ptr referans sayımı için bellek ayrılamadı başarısız olursa sızdırılmış olacak? Veya shared_ptr'nin kurucusu nesneyi silmek için sorumluluk alıyor mu?

cevap

7

shared_ptr belleği bellek alamıyor olsa bile kodunuz my_class nesnesini sızdırmaz. shared_ptr yapıcı C++ 11 standart (20.7.2.2.1) göre

:

Atar: bad_alloc veya bir uygulama-Tanımlanmış durum bellekte başka bir kaynak could elde edilmek.

İstisna güvenliği: Bir istisna atılırsa, p komutu silinir.

Kullanıcı tanımlı bir delici alan yapıcı sürümünde, bunun yerine delici kullanılacaktır.

Boost documentation, bunu belirtir.

+0

Şerefe. Google'ı ateşledim ama bir cevap bulamadım. Bu günlerden birinde kaynağı kontrol etmeyi öğreneceğim - yani standart. :-) – bythescruff

İlgili konular