假设有以下两个类:
struct A {
A() {}
};
struct B {
B(const A& a) {}
};
我多次遇到这样的情况,我必须创建一个类的临时实例才能构建我需要使用的实例。像这样的东西:
A a;
// Do very complex computations using a;
B b(a);
// use b, a is not needed anymore.
return make_result(b);
我的问题是,有时在我的计算之后 a
持有的资源可能很重要,在我实例化 b
之后我想释放它们。同时,整个过程 a -> b -> result
在逻辑上是一个非常紧凑的东西,我想避免将它拆分成函数,因为在这种情况下会有 pretty much nothing to gain .
C++ 中有哪些可用的解决方案来解决此类问题?
最佳答案
您可以将默认构造的对象分配给 A
,假设 A
的赋值运算符正确地释放了“资源”:
A a;
// Do very complex computations using a;
B b(a);
a = {};
// use b, a is not needed anymore.
return make_result(b);
您可以更改 B
以按值获取 A
并将构造的 A
实例移动到 B
中:
struct A {
A() {}
};
struct B {
B(A a) {}
};
// ...
A a;
// Do very complex computations using a;
B b(std::move(a));
// use b, a is not needed anymore.
return make_result(b);
它有一个很好的优势,即 B
的构造函数可能会从 A
对象中“窃取”资源。
您可以使用 lambda 构造 A
并将其传递给 B
:
B b([&]{
A a;
// Do very complex computations using a;
return a;
}());
// use b, a is not needed anymore.
return make_result(b);
你可以用 lambda 构造 A
, 让 B
按值获取它:
struct A {
A() {}
};
struct B {
B(A a) {}
};
// ...
B b([&]{
A a;
// Do very complex computations using a;
return a;
}());
// use b, a is not needed anymore.
return make_result(b);
它允许 B
从 A
窃取东西,但不会留下僵尸 A
实例。
关于c++ - 处理用于构造有用值的旧变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26818467/