具有唯一指针的右值和移动语义:对象 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
中的内容,但它从未被 new
ed(它只是指向某个静态数组)并且你得到运行时错误。
我正在尝试了解独特的指针和移动语义。现在,我在下面创建了一个虚拟示例来说明问题所在。我的问题是,为什么这段代码会抛出一个指针被释放未分配的错误?:
#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
中的内容,但它从未被 new
ed(它只是指向某个静态数组)并且你得到运行时错误。