具有唯一指针的右值和移动语义:对象 0x7ffee5c7b670 错误:未分配正在释放的指针

Rvalue and Move Semantics with Unique Pointer: error for object 0x7ffee5c7b670: pointer being freed was not allocated

我正在尝试了解独特的指针和移动语义。现在,我在下面创建了一个虚拟示例来说明问题所在。我的问题是,为什么这段代码会抛出一个指针被释放未分配的错误?:

#include <iostream>
#include <memory>

using namespace std;

template <class T>
class Object
{
public:
    T *values = nullptr;
    int size;
    Object(int size) : size(size)
    {
        values = new T[size];
    }

    ~Object()
    {
        delete[] this->values;
    }

    void myFunc(T *&&new_values)
    {
        cout << "myFunc called!" << endl;
        delete[] this->values;
        values = new_values;
    }

    void print()
    {
        for (int i = 0; i < size; i++)
            cout << this->values[i] << " ";
        cout << endl;
    }
};

int main()
{
    auto my_object = new Object<int>(4);
    std::unique_ptr<Object<int>> my_other_object(new Object<int>(4));

    int values[4] = {1, 2, 3, 4};
    int my_other_values[4] = {10, 20, 30, 40};

    /* This works all fine! */
    my_object->myFunc(std::move(values));
    my_object->print();

    /* This next bit throws pointer being freed was not allocated */
    my_other_object->myFunc(std::move(my_other_values));
    my_other_object->print();
}

这与std::unique_ptr无关。你得到“未分配指针被释放”错误的原因是因为显示的代码试图 delete 不是 newed.

的东西
    delete[] this->values;
    values = new_values;

delete 是旧的 values,但随后只是盲目地将 values 设置为指向从未被 new 编辑的内容(new_values 传递到此处的内容不会 new 在任何地方编辑)。

因此,此对象的析构函数稍后会尝试 delete values 中的内容,但它从未被 newed(它只是指向某个静态数组)并且你得到运行时错误。