Rozważmy prosty kod poniżej, który się rozbija:

#include <iostream>

struct test 
{
    int *x;
    test(){ x = new int;}
    ~test(){delete x;}
};
int main() {
    test x;
    test y = std::move(x);
    return 0;
}

Moje pytanie brzmi, że gdy zasoby obiektu są przenoszone przez std::move, co się stanie, gdy jego destruktor nazywa się jako naturalny przebieg obiektu wychodzący z zakresu? Czy to oznacza, że nie powinniśmy nazywać std::move dla obiektu na stosie?

3
code707 4 czerwiec 2018, 19:09

3 odpowiedzi

Najlepsza odpowiedź

Czy to oznacza, że nie powinniśmy nazywać std::move dla obiektu na stosie?

Nie, oznacza to, że powinieneś zapewnić konstruktor ruchu, który byłby ustawiony x do NULL.

Należy pamiętać, że w twoim przypadku nie ma domyślnego konstruktora ruchu, ponieważ zdefiniowałeś własny destruktor (Ref).

PS: Nie zapomnij o Reguła 5.

6
gsamaras 4 czerwiec 2018, 16:18

Kto jest odpowiedzialny za zwolnienie zasobów przeniesionych przez std::move?

Obiekt przesunąłeś dane do. Obiekt przesunął dane, muszą być bezpieczne w użyciu i niszczeniu.

3
Toby Speight 4 czerwiec 2018, 16:15