Dlaczego ten wskaźnik jest uważany za nullptr a nim nie jest?

0

Cześć,
mam taki przykład:

class A
{
	
};

class B
{

};

class C
{

};

class D
{
public:
	D(A* _a, B* _b, C* _c) :a(_a), b(_b), c(_c) {}
private:
	A* a;
	B* b;
	C* c;
};

int main() {
	D* d = new D( new A, nullptr, nullptr );

	if (d == nullptr)
	{
		std::cout << "SDSDSD";
	}
	return 0;
}

W skrócie jak sprawdzić czy d jest nullowe? Mimo, że ma zainicjalizowane "A" tj wskazuje na coś to i tak ifa nie przechodzi. Czy to jest poprawne działanie? Powinienem zatem sprawdzać każdy wskaźnik osobno czy może lepiej przeładować operator "=="?

3

Podany przez Ciebie kod działa prawidłowo:
https://ideone.com/y0isS0

4

W skrócie jak sprawdzić czy d jest nullowe?

Zdecyduj się co chcesz sprawdzać?

  • Czy obiekt d ma wartość nullptr
  • Czy też jego składowe mają wartość nullptr.

W pierwszym przypadku wystarczy zwykle if( d == nullptr ), czyli to co w tej chwili robisz, w drugim przypadku możesz napisać funkcję:

class D
{
public:
    D(A* _a, B* _b, C* _c) :a(_a), b(_b), c(_c) {}
    bool hasNullObjects() const { return (a==nullptr && b==nullptr && c==nullptr); }
private:
    A* a {nullptr};
    B* b {nullptr};
    C* c {nullptr};
};

Swoją drogą operowanie w ten sposób na surowych wskaźnikach, z dużym prawdopodobieństwem doprowadzi do wycieków pamięci lub użycia wskaźnika do nieistniejącego już obiektu. Pomyśl o użyciu inteligentnych wskaźników lub w ostateczności RAII.

3

W podanym kodzie d nigdy nie będzie nullptr - new nie zwraca nullptr bez (nothrow)

1 użytkowników online, w tym zalogowanych: 0, gości: 1