your example is not easy to read. IIUC, after execute(), the work queue is emptied and the last shared_ptr to struct K goes out of scope. K contains your promise and the future associated with it is accessed after the promise has been destroyed.
try a breakpoint in the destructor of K to make sure, I don't have tbb installed to test.