Собственно, ковыряю то, что написано в теме вопроса. Проблема возникла, когда я намеренно написал косячный код, а он, блин не упал.
Собственно, код:
#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
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, (обращение к более невалидному указателю), которое в данном случае выражается в нормальной работе. Это частный случай, который в другой ситуации (навскидку - виртуальный метод и вырубленная оптимизация) выстрелит вам в ногу. Не делайте так.
Комментариев нет:
Отправить комментарий