dimanche 4 octobre 2015

unique_ptr with array crash when calling reset

Can someone explain the crash here?

#include <iostream>
#include <memory>

int main() {
    int *num1 = new int(5),  *num2 = new int(18);
    std::unique_ptr<int> numptr = std::unique_ptr<int>(num1);
    std::cout << *numptr.get() << '\n';  // 5
    numptr.reset(num2);
    std::cout << *numptr.get() << '\n';  // 18

    int a[5] = {0,2,4,6,8},  b[5] = {0,3,6,9,12};
    std::unique_ptr<int[]> u = std::unique_ptr<int[]>(a);
    std::cout << u[3] << '\n';  // 6
    u.reset(b);
    std::cout << u[3] << '\n';  // Crash.  Why???  Should output 9, right?
}

There is no crash when calling reset with std::unique_ptr<int>, so why the crash with std::unique_ptr<int[]>. As I see it, u takes ownership of b, and then deletes a. So u[3] should be b[3] = 9 which should work fine because b is not deleted. What's going on here?

Aucun commentaire:

Enregistrer un commentaire