C++中对象的内存空间是在什么时候被分配的

C++中当创建一个对象时会自动调用它的构造函数,但是如果程序中有用到goto语句跳过或者对象是在swith中声明,在编译的时候就会报错,我想问下,在C++中这些程序开始声明的对象和程序中间声明的对象都是什么时候分配的空间(是在系统载入程序的时候就将程序中所有要用到的变量和对象一起分配么,还是走到定义处再分配),如果程序运行的时候跳过的定义处,在下面还能使用么?

你可能对C++中的结构体不是很了解。这些结构体有:enum(枚举),struct(结构),union(联合),class(类)。当你定义一个结构体类型时,是不存在内存分配的。譬如:
struct student
{
char *name;
int age;
};
这个时候仅仅是通知编译器有了student这种struct类型,没有内存分配。只有当声明一个对象时,即student s;时,编译器才会给变量s分配内存,且内存大小为student结构体大小,可以sizeof(s)求出为8。
另外,程序都是通过编译器编译成功后生成目标文件,才能执行的。编译器就是按顺序来给变量分配内存的,当然是走到变量声明处,才会给它分配内存。如果goto语句跳过变量声明,程序会报错,且看下面例子:
#include<iostream>
using namespace std;

int main()
{
goto b;
int i=10;
b:
cout<<i<<endl;

return 0;
}
很显然,编译器无法给i初始化,故编译出错。
另外,变量又分为全局变量和局部变量,又有static,auto等等之分。全局变量是在编译开始就分配内存,且放在静态存储区。局部变量则是走到该变量声明处才分配内存,且放在栈中,static也是指该变量放在静态存储区。如果想了解更多,请看网上高手写的日志:
http://pondra.blog.163.com/blog/static/491363082007111743634707/
以上拙见,希望能对你有所帮助。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-01-09
你需要的是一本计算机组成结构的书籍。

switch中不加大括号是不能声明对象的;分配空间的时机决定于你的对象分配的方式,栈上、堆上、全局?
第2个回答  2010-01-09
那为什么这个程序是对的?

#include <iostream>
using namespace std;

int main( )
{
int i=0;
if ( i == 0)
{
int a = i;
cout << a << endl;
}
else
{
int b = i+1;
cout << b << endl;
}
}
第3个回答  2010-01-09
C++允许在程序的内部申请变量,并不意味着可以在任何地方。具体的说,就是不允许在程序有分支的地方申请,比如if(a>b) int a;

至于类,如果学过C,就明白,其实只是有函数的结构体。他内部的变量空间,也是像普通变量一样申请的如上例中的int。

事实上,C++在这方面,只不过更人性化设计,对程序本身对多大的改变。只是不像c一样,一定要求在函数开始的地方将所有的变量都申请齐了。

至于楼主提问的,关于构造函数,实际上那申请的一般都是在堆内的空间。和我们刚才所说的,在栈内申请空间还是有本质区别的,希望楼主不要混淆~

C++里静态数据成员是在什么时候被分配空间和初始化的?又是在什么时候被...
静态数据变量分配空间跟初始化不一样,分配空间是指在程序运行开始时进行分配,并默认一个数据在内存空间中,如果以后没初始化,则这个数据相当于初始化,程序结束是释放,而初始化则是在你需要的时候进行初始化,当然你初始化的话内存空间中有一个数据.定义和声明不一样,函数声明则是声明有这么一个函数,而定...

C++ 意外的生命周期
容器中对象的生命周期在移动后仍然需要析构,因此在析构时需判断是否重复清理。临时量的生命周期可以通过引用延长,返回值为1时,`m`会被正常初始化。临时量的生命周期延长可以递归实现作用。列表初始化时,使用小字符串优化,仅分配一次内存,仅涉及`vector`内存分配。反之,分配5次内存,`initializer_...

C++中函数中的局部变量到底是不是执行到变量定义处才分配内存吗,为什么...
C语言C++语言的局部非静态变量或者局部非静态对象在函数开始执行的时候就分配好了内存空间,但是在到达对象或者变量的定义点之前,是不能对其进行引用的。对于局部非静态对象,构造函数只有到定义点才调用。这些都是实现细节,不是C++标准定义的,所以不同的编译器和系统可能有所不同的实现。在C++语言中,...

c++ 变量的生命周期和内存的分配释放
常量区,全局存在,程序结束后由操作系统收回。堆区,全局存在,程序员主动申请,主动释放,如果不释放,导致内存不足,于一个常驻进程内存泄漏,导致程序异常,无法继续申请内存,当程序结束后,此部分内存由操作系统收回。栈区,局部存在,系统分配,作用周期在两个花括号之间,进入花括号,操作系统会在栈...

请详细解释一下c++中的new和delete
在用new动态建立(上面)一个对象时,会返回一个指向新对象的指针值,即分配的内存空间首地址。通过这个指针调用对象很方便。【静态方面:const :使数据在一定范围共享,又保证它不被随意修改。即定义为常量。① int * const p = a; \/\/常指针 const修饰指针,p的指向不可变。在定义 的时候指向...

C++全局变量初始化
在C语言中,全局和静态变量的内存空间为全局,即使未初始化,内存空间也存在。如果进行初始化,初始化操作在代码执行之前完成,属于编译期初始化。对于内置变量,无需资源释放,仅需回收内存空间,因此在程序结束时,全局内存空间被一起回收。而在C++中,引入了对象,这带来了管理全局变量的新挑战。对象需要...

c++中两个局部变量和全局变量,变量名相同,请问内存空间如何分配?
第一点:一个由 c\/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式 类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收 。注意它与数据结构中的堆是两...

c++ 中 析构函数中 delete和destory的区别是
C++中的析构函数用于释放对象所占的内存资源。析构函数会在对象生命周期结束时自动调用,对于静态声明的对象,其析构函数会在离开作用域时自动执行。而对于动态分配的对象,则需要使用delete关键字来调用析构函数,从而释放内存。析构函数的执行过程是从派生类开始,逐步释放成员变量所占的内存,最后释放基类...

c++中什么是生存期?
生存期:从对象分配到内存开始,到垃圾回收器从内存中删除对象结束这一段时间。析构函数也就是释放内存空间的,也就是析构函数调用之后。

C++自由存储区和堆栈
一般而言,自由存储区是指CRT(C运行时库)通过malloc,free函数管理的内存。堆特指通过new,delete管理的内存。但是在部分编译器的实现上这两块内存都是同一种管理方式。4. int* p = new int 如上述,在exe的进程空间栈内存空间里面。5 栈产生的时机如2所讲,是在一个线程创建的时候。 在C++程序...

相似回答