四种不同的对象生存方式(in stack、in heap、global、local static)的区别是什么?

来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/23 12:13:45
四种不同的对象生存方式(instack、inheap、global、localstatic)的区别是什么?四种不同的对象生存方式(instack、inheap、global、localstatic)的

四种不同的对象生存方式(in stack、in heap、global、local static)的区别是什么?
四种不同的对象生存方式(in stack、in heap、global、local static)的区别是什么?

四种不同的对象生存方式(in stack、in heap、global、local static)的区别是什么?
在 C++ ㆗,有㆕种方法可以产生㆒个对象.第㆒种方法是在堆栈(stack)之㆗产生它:
void MyFunc()
{
CFoo foo; // 在堆栈(stack)㆗产生 foo 对象
...
}
第㆓种方法是在堆积(heap)之㆗产生它:
void MyFunc()
{
...
CFoo* pFoo = new CFoo(); // 在堆积(heap)㆗产生对象
}
第㆔种方法是产生㆒个全域对象(同时也必然是个静态对象):
CFoo foo; // 在任何函数范围之外做此动作
第㆕种方法是产生㆒个区域静态对象:
void MyFunc()
{
static CFoo foo; // 在函数范围(scope)之内的㆒个静态对象
...
}
不论任何㆒种作法,C++ 都会产生㆒个针对 CFoo 建构式的呼叫动作.前两种情况,C++
在配置内存 -- 来自堆栈(stack)或堆积(heap)-- 之后立刻产生㆒个隐藏的(你的原
始码㆗看不出来的)建构式呼叫.第㆔种情况,由于对象实现于任何「函数活动范围
(function scope)」之外,显然没有㆞方来安置这样㆒个建构式呼叫动作.
是的,第㆔种情况(静态全域对象)的建构式呼叫动作必须靠startup 码帮忙.startup 码
是什么?是更早于程序进入点(main 或 WinMain)执行起来的码,由 C++ 编译器提供,
被联结到你的程序㆗.startup 码可能做些像函数库初始化、进程信息设立、I/O stream 产
生等等动作,以及对 static 对象的初始化动作(也就是呼叫其建构式)