Безопасно ли инициализировать указатель внутри структуры с помощью метода device_vector::data() из локально объявленного device_vector в конструкторе?

Я закодировал несколько функторов, которые инициализируют указатель члена следующим образом:

struct A
{
    A() {
        thust::device_vector<int> d_vect(3);
        d_vect[0]=1;
        d_vect[1]=2;
        d_vect[2]=3;

        pointer = thrust::raw_pointer_cast(d_vect.data());
    }

    __host__ __device__ void operator() {
        //code using pointer
    };

    int* pointer;

};

Функтор, закодированный таким образом, работает без каких-либо явных проблем, поэтому мне интересно, что происходит с данными, хранящимися в d_vect. Читая документацию, у меня сложилось впечатление, что эти данные должны быть уничтожены, когда d_vect выходит за рамки, поэтому я ожидаю, что точка данных pointer должна быть стерта, но это не так. Пожалуйста, может кто-нибудь разъяснить мне эту вещь?


person Antonio Augusto Alves Junior    schedule 08.05.2016    source источник
comment
Как только вызывается деструктор вектора, указатель становится недействительным. Другими словами, как только конструктор завершится. Кроме того, я правильно отформатировал ваш код.   -  person Brandon    schedule 08.05.2016
comment
Это неопределенное поведение. Тот факт, что он работает, является случайностью, и вы не должны полагаться на то, что он когда-либо работает правильно.   -  person talonmies    schedule 08.05.2016


Ответы (1)


Вы правильно поняли: thrust::device_vector — это управляемый контейнер, который освобождает все выделенное хранилище, когда выходит за рамки.

Теперь дераспределение просто обновляет бухгалтерскую информацию о том, какие блоки памяти можно использовать бесплатно, оно явно не перезаписывает эти блоки, скажем, нулями (по соображениям производительности). Вы должны сделать это вручную, если это то поведение, которое вы хотите.

person Community    schedule 08.05.2016