我正在努力理解指针和移动语义的独特性。现在,我在下面创建了一个伪示例来说明问题所在。我的问题是,为什么这段代码会抛出一个释放的指针未分配错误?:
#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
ed的东西(传入此处的new_values
在任何地方都不是new
ed(。
因此,稍后,该对象的析构函数尝试delete
(现在位于values
中(,但它从未被new
ed(它只是指向某个静态数组(,您会得到运行时错误。