gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:47:49 25 4
gpt4 key购买 nike

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

#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编辑(它仅指向某个静态数组),并且您会遇到运行时错误。

关于c++ - 具有唯一指针的右值和移动语义:对象0x7ffee5c7b670错误:未分配正在释放的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63860586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com