У меня есть простой класс:
class B
{
public:
int getData() { return 3; }
};
затем я инициализирую указатель на него с помощью nullptr:
B *foo{ nullptr };
И тут, пытаясь им воспользоваться, приходит сюрприз:
int t = foo->getData();
и t теперь равно 3. Как это возможно без построения класса? Это потому, что getData() не использует «это»? Это сломало все мои знания об указателях.
Это ожидаемое поведение? Я работаю в Visual Studio 2013.
foo->getData()
эквивалентноgetData(foo);
и вызываемый объект никогда не разыменовывает аргумент. Обратите внимание, что хотя это и работает, в C++ оно классифицируется как неопределенное поведение. - person Nawaz   schedule 01.03.2016assert
странно работает в Windows, они думают, что вы можете продолжить после сбоя утверждения. В Linux и Mac это невозможно, а утверждение об ошибке всегда невозвратно. Что я делаю, так это не использую утверждение из<cassert>
, вместо этого я пишу макросASSERT
, который проверяет условие и вызываетstd::abort
в случае сбоя. Так как это работает одинаково на всех платформах. ИМО, пытающаяся продолжить после утверждения, является бессмысленным микрософтизмом, лучше иметь кросс-платформенное поведение. (Большинство людей просто живут с этим.) - person Chris Beck   schedule 01.03.2016