Страницы

Поиск по вопросам

воскресенье, 7 апреля 2019 г.

Умные указатели (unique_ptr) и вызов функций-членов класса

Собственно, ковыряю то, что написано в теме вопроса. Проблема возникла, когда я намеренно написал косячный код, а он, блин не упал.
Собственно, код:
#include #include
struct cdmem { cdmem() { std::cout << this << " :: cdmem::cdmem()" << std::endl; }; cdmem(const cdmem&) { std::cout << this << " :: cdmem::cdmem(const cdmem&)" << std::endl; }; cdmem(const cdmem*) { std::cout << this << " :: cdmem::cdmem(const cdmem*)" << std::endl; };
void testf() { std::cout << this << " :: testf()" << std::endl; };
~cdmem() { std::cout << this << " :: cdmem::~cdmem()" << std::endl; }; };
int main() { std::unique_ptr pd(new cdmem); if(!pd) { std::cout << "
ERR1 " << std::endl; return 1; } pd->testf(); auto pd1(std::move(pd)); pd->testf(); // Вот тут указатель уже нулевой return 0; }
Вывод:
0x801c06058 :: cdmem::cdmem() 0x801c06058 :: testf() 0x0 :: testf() // this равен 0x0 0x801c06058 :: cdmem::~cdmem()
Получается, что обращения к самому объекту не происходит?


Ответ

Это классическое UB, (обращение к более невалидному указателю), которое в данном случае выражается в нормальной работе. Это частный случай, который в другой ситуации (навскидку - виртуальный метод и вырубленная оптимизация) выстрелит вам в ногу. Не делайте так.

Комментариев нет:

Отправить комментарий