Почему не работает перемещение в C++?

Есть картинка весом 12 мб. Для нее нужно написать функцию, которая перемещает буфер.
#include <iostream>
#include <vector>

using namespace std;

class Img{
public:
    vector<int*> imgs;
public:
Img(){

}

void addOperation(int* img){
    imgs.push_back(std::move(img));
}

};

int main()
{
    int* a = (int*) malloc(12*1024*1024); //12МБ в куче
    for (int i=0;i<100;i++) a[i]=i; //чтобы можно было смотреть на данные
    Img imgs;
    imgs.addOperation(a);
    cout<<a[20]<<endl; //20, хотя из-за move тут по идее ничего нет
    cout<<imgs.imgs[0][20]<<endl; //20
    return 0;
}

a[20] выводит 20
Складывается впечатление что вместо move тут копирование.
  • Вопрос задан
  • 133 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
У вас полная каша в голове. Вы не понимаете, что такое перемещение, копирование.

Вот как вы себе пердставляете перемещение int*?
int* - это адрес в памяти. Число. Когда вы "перемещаете" img этого типа, вы перемещаете одно число. Из переменной img, в вектор.

При этом что там лежит в памяти по адресу, равному этому числу (или на 20 сдвинутому), вообще не поменялось.

Да, указатели используются в перемещении. Вместо того, чтобы копировать буффер в новое место. можно просто переприсвоить указатель в новой структуре на указатель в старой. Именно так вы перемещаете указатель, вместо копирования данных по этому адресу. Вот чем перемещение отличается от копирования.

Так, у вас в imgs вы не пихаете копию данных, а пихаете указатель.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы