Жизненный цикл объекта и многопоточность - PullRequest
0 голосов
/ 13 мая 2018

Мы передаем объект другому потоку.Предполагается, что он будет удален, когда функция oops2 () находится вне области видимости.Как это возможно, что после удаления объекта данных у нас нет сбоев в другом потоке, и другой поток успешно работает с этим объектом?

class Data {
public:
    Data(int val = 0) {}
    int getVal () const { return mVal; }
    void setVal(int val) { mVal = val; }
protected:
    int mVal;
};

void set_val(int& i, Data* data)
{
    data->setVal(i);
}

void print_val(Data* data)
{
    cout << "Data value = " << data->getVal() << endl;
}

struct func2
{
    Data* data;
    func2(Data* data_): data(data_){}

    void operator()()
    {
        printf("Address of func2 data is %p\n", data);
        for (int j=0;j < 1000000;++j)
        {
            print_val(data);
            set_val(j, data);
        }
    }
};

void oops2()
{
    Data* data = new Data(100);
    func2 my_func(data);
    my_thread = std::thread(my_func);
    delete data;
}

int main()
{
    oops2();
    my_thread.join();
    return 0;
}
...