2012-03-19 16 views
8
#include <stdlib.h> 
#include <iostream> 
#include <vector> 
#include <string> 
class A 
{ 
public: 
    std::string s; 
    A() 
    { 
     s = "string"; 
     new(this)A(*this); 
    } 
}; 
int main() 
{ 
    A a; 
    std::cout<<a.s; 
    return 0; 
} 

Otrzymuję pusty ciąg na wyjściu. Co mówi standard C++ o takim zachowaniu?wywoływanie konstruktora kopii wewnątrz innego konstruktora

+3

Auwgh, naprawdę potrzebuję teraz kawy. –

+0

Mam "ciąg" na wyjściu z GCC 4.5 – CapelliC

+0

jest to: 'new (this) A (* this);' wywołanie konstruktora kopii wewnątrz innego konstruktora? –

Odpowiedz

4

Musi być co najmniej dwa problemy tutaj:

  • spróbować zainicjować z kopią sobie
  • wewnątrz konstruktora, A nie jest jeszcze w pełni skonstruowany, tak naprawdę nie można go skopiować

Nie wspominając, że new(this) jest podejrzany sam w sobie.

+1

'new (this)' jest w porządku. Przypisywanie do czegoś z własną kopią jest zwykle gwarantowane również do pracy (operator przydziału kopiowania musi zabezpieczyć się przed samozasłonięciem) - z drugiej strony, kopiowanie konstrukcji jest inną sprawą. –

+0

@Konrad: Więc domyślny (wygenerowany) egzemplarz ctor jest chroniony przed samo-przydziałem, a zatem faktyczne kopiowanie nie jest wykonywane? Wydaje się, że pośrednia zmienna Aa (* this); nowy (this) (a); rozwiązuje "problem"? – user396672

+0

@ user396672 Nic w tym rodzaju. Domyślny * operator przydziału kopiowania * chroni przed samozasłonięciem. Nie sądzę, że domyślny konstruktor kopiowania, po prostu dlatego, że ten przypadek nie powinien normalnie nigdy nie wystąpić. –

0

Wywołujesz konstruktordwa razy z rzędu, wykonując to, ergo, zachowanie jest niezdefiniowane (i najprawdopodobniej część pamięci wyciekła).

Powiązane problemy