sha*_*oth 3 c++ memory memory-management duration
请考虑以下代码:
class Test() {
public:
Test()
{
memset( buffer, 0, sizeof( buffer ) );
}
void Process()
{
printf( buffer );
}
private:
char buffer[1000];
};
int main()
{
Test().Process();
char buffer[1000] = {};
print( buffer );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我无法推断是否buffer允许在main中重用以前由临时对象占用的内存class Test.根据标准自动存储(3.7.2/1)必须至少持续到块结束.
我找不到强制临时对象使用自动存储的措辞,除了6.6/2,其中描述了一个跳转语句,并说在退出范围[...]时,所有构造对象都会调用析构函数(12.4)具有自动存储持续时间(3.7.2)(命名对象或临时对象),这似乎意味着临时使用自动存储.
临时工需要使用自动存储吗?main上面代码中的局部变量是否允许重用以前由临时占用的内存,还是应该使用不同的存储?
临时的生存期(除非绑定到a const&)延伸到完整表达式的末尾.在你的情况下第一行main.允许编译器重用相同的内存,但它是否具有实现细节(即实现的质量)
12.2 [class.temporary]
/ 3 [...]临时对象被作为评估全表达式(1.9)的最后一步而被销毁,该表达式(词法上)包含创建它们的点.[...]
/ 4有两种情况,临时表在与完整表达结束时不同的点被销毁.第一个上下文是表达式作为定义对象的声明符的初始值设定项.[...]
/ 5第二个上下文是引用绑定到临时的.
由于您既不是例外,Test临时属于第一类,并且作为评估第一行的最后一步被销毁.
| 归档时间: |
|
| 查看次数: |
172 次 |
| 最近记录: |