budowa dwufazowy przyjmuje następującą postać:Czy inteligentne wskaźniki wykluczają potrzebę budowy dwufazowej?
struct something {
something()
: p1(NULL)
, p2(NULL)
{ }
~something() {
if (p1) delete p1;
if (p2) delete p2;
}
void initialize() {
p1 = new int(2);
p2 = new int(5); // May throw if allocation fails!
}
int* p1;
int* p2;
};
punktu, który jest, że naiwny konstruktor (który nie oglądać za niepowodzenia alokacji) będzie przeciekać pamięć: destructor częściowo zbudowane obiektu nigdy nie jest nazywany .
Moje pytanie: czy poniższy kod jest bezpieczny, a przez corollary, czy inteligentne wskaźniki zapobiegają dwufazowej konstrukcji?
struct something {
something()
: p1(new int(2))
, p2(new int(5))
{ }
std::unique_ptr<int> p1;
std::unique_ptr<int> p2;
};
Nie potrzebujesz warunku przed 'delete'. Poważnie, nie masz. Usuwanie wartości zerowej jest całkowicie w porządku. –
Są też nowe i niepotrzebne skasowania, które działają z alokacją pamięci podobnie jak malloc()/free(). Ale nawet jeśli sama alokacja nie zakończy się niepowodzeniem przy użyciu nowych/niezawierających rzutów, konstruktorzy obiektów mogą nadal rzucać. –
@KerrekSB Noted. :) –