C++ 如何将唯一指针传递给函数中所需的特定参数?

C++ 如何将唯一指针传递给函数中所需的特定参数?,c++,C++,下面是一个简短而有效的例子: std::unique_ptr<float> x(new float[whatever_size]); 我怎样才能通过传递x来称呼它呢。 我试过: 一个简短的回答和解释就好了。 谢谢 首先,您应该知道,一个唯一的指针并不能神奇地保护您免受内存管理混乱的影响。您的用例非常可疑,我要提醒您不要假设一个唯一的指针可以解决所有问题 函数需要一个可修改的左值引用。调用x.get()返回一个右值。当然,不管你怎么努力,引用都不会约束它。现在,显而易见的解决方案是

下面是一个简短而有效的例子:

std::unique_ptr<float> x(new float[whatever_size]);
我怎样才能通过传递x来称呼它呢。 我试过:

一个简短的回答和解释就好了。
谢谢

首先,您应该知道,一个唯一的指针并不能神奇地保护您免受内存管理混乱的影响。您的用例非常可疑,我要提醒您不要假设一个唯一的指针可以解决所有问题


函数
需要一个可修改的左值引用。调用
x.get()
返回一个右值。当然,不管你怎么努力,引用都不会约束它。现在,显而易见的解决方案是引入一个临时的:

auto *f = x.get();
function(f);
但是如果
函数
需要实际修改
f
、指针而不是指针对象,那么这种情况可能会再次发生,并击中你的脚


既然你提到了它,那就说明它确实修改了它的论点。您必须在调用前从唯一指针重新获取所有权,并在以下情况后将其返回:

auto *f = x.release();
function(f);
x.reset(f);

这是更改在
x
中反映的唯一方式。但是,它仍然有点脆弱。

这里的问题是,函数可以修改传递给它的指针(通过非常量引用传递),可能会重新放置它。如果是这种情况,那么您必须执行以下操作:

std::unique_ptr<float[]> x(new float[N]); // remember the array type []

float* fp = x.release();
func(fp);
x.reset(fp);
std::unique_ptr x(新浮点[N]);//记住数组类型[]
float*fp=x.release();
func(fp);
x、 重置(fp);
但关键点是传入一个正确的(命名的)指针,而不仅仅是
x.get()
返回的临时指针


出现错误的原因是函数无法修改函数
x.get()
返回的临时指针。你必须给它一个可以改变值的实数指针。

你应该对数组使用
std::unique\u ptr
(或者最好使用向量)。与你眼前的问题无关,但是你的
x
应该声明为
std::unique_ptr
-否则你的代码将显示未定义的行为,因为数组被
delete
而不是
delete[]
删除。为什么
函数
接受
浮点*&
而不是
浮点*
?它真的修改了它的参数吗?如果是,它会做什么?@DanielH它确实修改了它的参数。你真的不想做任何这一切。
释放
-和-
重置
序列可能正常工作,也可能不正常工作,这取决于
函数
的确切功能。例如,如果
函数
没有解除分配
f
@DanielH,您可能希望跳过
释放
步骤如果函数没有修改传入的指针,那么为什么它会通过非常量引用接收它?@DanielH-如果
函数
是文明的,那么释放不会造成伤害。如果它接受一个它应该为调用拥有的原始指针,并在不取消分配的情况下抛出,那么它是邪恶的,不应该被使用。@OmidCompSCI-一个唯一的指针并不能神奇地保护您,使您不会搞砸内存管理。您的用例非常可疑,我要提醒您不要假设一个唯一的指针可以解决所有问题。@OmidCompSCI因为,即使您不想使用订阅运算符,在分配
new[]
时使用
delete
而不是
delete[]
也是未定义的行为。这可能是因为在您的实现中,它适用于具有平凡析构函数的类型,但也可能是因为它似乎可以工作,但稍后会导致微妙的问题,并且如果您使用不同的编译器或不同的编译器标志,这两种方式都可能发生变化。
auto *f = x.release();
function(f);
x.reset(f);
std::unique_ptr<float[]> x(new float[N]); // remember the array type []

float* fp = x.release();
func(fp);
x.reset(fp);