1

据我所知,我们可以在运行时或编译时创建对象。例如

SomeType object1;
SomeType *object2 = new SomeType;

所以我认为在这里的代码中;

int main(){

    cout << "lalalal";
    SomeType object1;
}

应该为 object1 调用构造函数,然后 lalalal 应该出现在屏幕上。因为编译器在程序启动之前分配内存。那么我在什么时候错了?

4

3 回答 3

5

据我所知,我们可以在运行时或编译时创建对象。

并不真地。在您的代码示例中,第一个对象是使用自动存储持续时间创建的(通常描述为“在堆栈上”),第二个对象是使用分配 的动态存储持续时间创建的(通常描述为“在堆上”)。但这些都发生在运行时。

应该为 object1 调用构造函数,然后 lalalal 应该出现在屏幕上。

函数中的语句从上到下执行(显然不包括循环)。所以对象是第二个创建的。*

因为编译器在程序启动之前分配内存。

是的,内存可能是提前分配的。但就可观察到的影响而言,这无关紧要。


* 但是,由于您没有在字符串中包含换行符,您可能会看到行缓冲的效果;在许多系统上,直到收到换行符或程序终止才会显示输出。

于 2013-01-01T21:43:15.537 回答
1

首先,C++ 中有两个独立的概念:存储持续时间和对象生命周期。虽然存储持续时间不能短于对象的生命周期,但反过来不一定正确。其次,两者都是运行时概念,而不是编译时。

但是,在这种情况下,没有真正的区别。对象的存储持续时间和生命周期都object1在定义执行时开始,并在超出范围时结束。事实上,大多数编译器会在函数顶部为局部变量分配所有内存,但这仅仅是因为符合标准的程序无法判断它不是在定义时分配的。然而,任何影响程序可观察行为的事情都必须在标准规定它应该发生时发生。

于 2013-01-01T22:19:38.453 回答
0

不,object1在您的示例中不是在编译时“创建”的,它是在运行时创建的,就像其他对象一样。而且,object1在命令执行之后是“构造”的cout,因此它的构造函数是在之后执行的。不过,它的内存可能在此之前已分配。

于 2013-01-01T21:49:27.150 回答