据我所知,我们可以在运行时或编译时创建对象。例如
SomeType object1;
SomeType *object2 = new SomeType;
所以我认为在这里的代码中;
int main(){
cout << "lalalal";
SomeType object1;
}
应该为object1调用构造函数,然后lalalal应该出现在屏幕上。因为编译器在程序启动之前分配内存。那么在什么时候我错了?
答案 0 :(得分:5)
据我所知,我们可以在运行时或编译时创建对象。
不是真的。在您的代码示例中,第一个对象是使用自动存储持续时间(通常描述为“在堆栈上”)创建的,第二个对象是 已分配 动态存储持续时间(通常描述为“在堆上”)。但这些都是在运行时发生的。
应该为object1调用构造函数,然后lalalal应该出现在屏幕上。
函数中的语句从上到下执行(显然不包括循环)。因此,对象是第二个创建的。 *
因为编译器在程序启动之前分配内存。
是的,内存可能是提前分配的。但就可观察的效果而言,这是无关紧要的。
<小时/> *但是,由于你没有在字符串中包含换行符,你可能看到的是行缓冲的效果;在许多系统上,只有在收到换行符或程序终止之前,才会显示输出。
答案 1 :(得分:1)
首先,C ++中有两个独立的概念:存储持续时间, 和对象的生命周期虽然存储时间不能 比对象寿命短,反过来不一定 真正。第二,两者都是运行时概念,而不是编译时间。
然而,在这种情况下,没有真正的区别。这俩
存储持续时间和对象object1
的生命周期开始
当定义执行时,并在它退出时结束
范围。实际上,大多数编译器将分配所有内存
对于函数顶部的局部变量,但仅仅是因为
合规程序无法证明它不是
在定义中分配。任何影响的东西
但是,当程序的可观察行为必须发生时
标准说它应该发生。
答案 2 :(得分:0)
不,您的示例中的object1
在编译时未“创建”,它在运行时创建,就像其他对象一样。此外,object1
在执行cout
命令后被“构造”,因此之后执行它的构造函数。尽管如此,它的内存可能已经分配了。