c++ - 处理用于构造有用值的旧变量

标签 c++ destroy temporary

假设有以下两个类:

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);

它允许 BA 窃取东西,但不会留下僵尸 A 实例。

关于c++ - 处理用于构造有用值的旧变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26818467/

相关文章:

PHP session 销毁

c++ - 将唯一指针引用保存到唯一指针引用

mysql - 我可以在 mysql 中创建索引而不调用创建目标表大小的临时表吗?

c++ - 聚合引用成员和临时生命周期

c++ - 如何以相反的顺序对以一对作为键的 map 进行排序?

c++ - C++中goto语句对栈的影响

未调用 C++ 构造函数

c++ - 多个 std::string 临时对象导致相同的 c_str 指针

c++ - 为什么 std::unique_ptr 不隐式转换为 T* 和 const T*?

c++ - 如何从 OpenCV 中的目录中按顺序读取文件?