Podobno mam następujące klasy:Dostęp niezainicjowanej zmiennej prywatnej atomowej w C++
class A
{
public:
...
...
void incrementN() {++n_;}
uint64_t getN() {return n_;}
private:
std::atomic<uint64_t> n_;
...
...
};
Załóżmy, że mam zainicjować wszystkie inne zmienne w klasie, z wyjątkiem n_
i że nie jest to pamięć lokalna wątku, więc nie ma bez inicjalizacji zerowej.
Tworzę obiekt klasy A i dzwonię pod numer incrementN()
.
Jeśli w pewnym momencie chcę wartość n_
i wzywam getN()
, może to spowodować, że load()
rutyna dla atomowej n_
do katastrofy?
Czy masz domyślny konstruktor 'A' lub dowolny konstruktor' A'? Jeśli nie masz żadnych konstruktorów lub domyślnego konstruktora ('A() = default;'), wówczas domyślny konstruktor wygenerowany przez kompilator wywoła domyślny konstruktor wszystkich niestatycznych elementów ([reference] (http: // en .cppreference.com/w/cpp/language/default_constructor)), a domyślny konstruktor '' std :: atomic' (http://en.cppreference.com/w/cpp/atomic/atomic/atomic) będzie nazywa. –
Tak, mam konstruktora dla A i inicjuje inne zmienne A, ale nie inicjuje 'n_' – user1715122
@JoachimPileborg n_ jest domyślnie zainicjowany, obiekt jest skonstruowany, jego wartość jest nieokreślona, więc nie jest to UB. – Rost