Технически, то, что вы здесь сделали, делает влечет за собой неопределенное поведение. Однако, поскольку ваш getNum
метод не является virtual
и не использует вообще ничего, что this
, на этот раз не произойдет сбой. Чтобы понять почему, представьте, что компилятор внутренне переписал вашу программу следующим образом:
class A { };
int A_getNum(A* this) { return 1234; }
int main()
{
A* pA = 0;
std::cout << A_getNum(pA) << '\n';
}
Вы можете видеть, что нулевой указатель никогда не разыскивается 1010 *, даже если нет действительного объекта A
, поэтому он не падает. shared_ptr
не имеет значения - вы получите тот же эффект, если бы использовали пустой указатель.
Если вы хотите заставить shared_ptr
сбить вас всякий раз, когда ->
используется для нулевого указателя, я не верю, что есть что-то стандартное. Ваш компилятор может иметь опцию отладки, которую вы можете включить, хотя - например, если я скомпилирую вашу программу с gcc 4.5 и -D_GLIBCXX_DEBUG
, я получу
$ ./a.out
/usr/include/c++/4.5/bits/shared_ptr_base.h:710:
_Tp* std::__shared_ptr<_Tp, _Lp>::operator->() const
[with _Tp = A, __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]:
Assertion '_M_ptr != 0' failed.
Aborted
Не могу помочь с MSVC, извините.