【发布时间】:2021-10-21 08:30:50
【问题描述】:
我目前正在试验以下方法来最终处理一些数据(伪代码)。
void run_processing(container datas)
{
// runs some conversion on data and sends it somewhere.
}
struct process_item
{
container datas;
process_item(const char* data)
{
datas.add(data);
}
~process_item()
{
run_processing(datas);
}
operator <<(const char* data)
{
datas.add(data);
}
}
process_item create_item(const char* data)
{
process_item item(data);
// Possible additional calls to setup item.
return item;
}
在我的测试中,这允许调用。
create_item("my_data") << "additional data" << "even more data";
// Once this piece executes the destructor for process_item is assumed to be called.
伪代码并没有真正显示出预期的好处,但这不是我的问题。
我正在尝试这个,因为我有一些限制;在输入所有数据之前,无法开始处理,除了 process_item 的范围结束时,不知道何时会出现这种情况。为简单起见,假设在添加最后一个数据后我无法调用其他方法或添加标志。
是否可以假定析构函数在预期时间被调用,或者根据优化级别和编译器选择不同的选项是否太冒险了?
澄清
“在正确的时间”表示下一行之前,调用 create_item 之后的那一行。
【问题讨论】:
-
当你说“deallocator”时,你可能指的是析构函数,对吧?该标准明确定义了何时调用析构函数,因此编译器或优化级别之间不会有任何差异。
-
指出了问题的关键。 “在预期的时间” - 你什么时候期待它被调用。
-
可能是 OT:你知道表达式
create_item("my_data")可以涉及多次调用~process_item()析构函数吗? NRVO(复制省略类型)不是强制性的。 -
是的,析构函数总是在你认为的时候被调用。它不像垃圾收集语言。
-
@Thizzer:在这种情况下,您需要考虑复制和移动构造函数。我建议删除复制 ctor,并实现移动 ctor,以便只有移动到的对象进行处理。