初始化 C++ 对象/结构体
初始化 C++ 对象/结构体
除了动态内存分配之外,下面两行代码之间有功能上的区别吗:
Time t (12, 0, 0); //t is a Time object Time* t = new Time(12, 0, 0);//t is a pointer to a dynamically allocated Time object
当然我假设已经定义了 Time(int, int, int)
构造函数。我也意识到在第二种情况下,t
需要被删除,因为它是在堆上分配的。还有其他区别吗?
admin 更改状态以发布 2023年5月24日
这行代码:
Time t (12, 0, 0);
... 在本地作用域中分配了一个Time
类型的变量,通常在堆栈上,这个变量将在其作用域结束时被销毁。
相比之下:
Time* t = new Time(12, 0, 0);
... 通过调用::operator new()
或Time::operator new()
来分配一个内存块,并随后使用this
设置为该内存块内的地址(同时作为new
的结果返回),然后将其存储在t
中的Time::Time()
。正如你所知,这通常在堆上(默认情况下)完成,需要在程序中稍后delete
它,而t
中的指针通常存储在堆栈中。
N.B.: 这里我使用的"通常"是指常见的实现方式。C++标准不以机器的堆栈和堆作为区别,而是以它们的生存期为区别。本地作用域的变量具有"自动存储期",因此在本地作用域结束时被销毁;而使用new
创建的对象具有"动态存储期",只有在delete
时才会被销毁。在实际应用中,这意味着自动变量在堆栈上创建和销毁,而动态对象存储在堆上,但语言不要求如此。