具有唯一指针的Rvalue和Move Semantics:对象0x7ffee5c7b670出错:未分配释放的指针



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

#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设置为指向从未newed的东西(传入此处的new_values在任何地方都不是newed(。

因此,稍后,该对象的析构函数尝试delete(现在位于values中(,但它从未被newed(它只是指向某个静态数组(,您会得到运行时错误。

最新更新