Witam wszystkich jestem nowy na forum. Mam problem z unique_ptr albo z IDE.
Używam Code::Blocks 20.03 z Kompilatory/x86_64-13.1.0-release-posix-seh-ucrt-rt_v11-rev1/mingw64/ i MVS 2022 z
MSVC 19.38.33141 z PlatformToolset v143. Problem polega na tym że MVS po przeniesieniu funkcją move() własności na nowy unique_ptr mogę odwoływać się unieważnionym wskaźnikiem do metod class pomimo że stary unique_ptr zmienia się w nullptr .
Co do pól w class działa prawidłowo i kompilator zgłasza błędy. Jeszcze gorzej jest z Code::Blocks i gcc tam nie tylko mogę odwoływać się do metod ale i pól class i kompilator mówi że jest git i zero błędów. Ale w tym przypadku (co do zmiennych ) podpala się Norton i mówi bast! A metody przepuszcza.
Co jest nie tak? Kod programu:
#include <iostream>
#include <memory>
class MyClass {
public:
int x = 88;
MyClass() { std::cout << "MyClass Constructor\n" << std::endl; }
~MyClass() { std::cout << std::endl << "MyClass Destructor" << std::endl; }
void display() { std::cout << "Hello from MyClass\n" << std::endl; }
};
int main() {
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
std::cout << "ptr1->x = " << ptr1 -> x << std::endl;
std::cout << "ptr1->display() : ";
ptr1->display();
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
std::cout << "ptr2 = std::move(ptr1)" << std::endl << std::endl;
std::cout << "ptr2->x = ";
std::cout << ptr2->x << std::endl;
std::cout << "ptr2->display() : ";
ptr2->display();
if (ptr1 == nullptr) {
std::cout << "Now ptr1 is nullptr after \"ptr2 = move(ptr1)\"!" << std::endl;
std::cout << "Whay does it work: ptr1->display()!!!!!!!!!! : " ;
ptr1->display();
}
//brak błędu i to działa
ptr1->display();
std::cout << "\n";
//std::cout << ptr1 -> x << std::endl; //Tutaj ok przy zmiennych kompilator zgłasza błąd.
return 0;
}