c++ 使用new示例化对象与不使用new示例化对象有什么区别

zbwhf8kr  于 2023-01-06  发布在  其他
关注(0)|答案(9)|浏览(136)

除了动态内存分配之外,以下两行代码之间是否存在功能差异:

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) ctor,我也意识到,在第二种情况下,t需要删除,因为它是在堆上分配的,还有其他区别吗?

oug3syen

oug3syen1#

该行:

Time t (12, 0, 0);

...在局部作用域中分配一个Time类型的变量,通常在堆栈上分配,当作用域结束时将被销毁。
相比之下:

Time* t = new Time(12, 0, 0);

...通过调用::operator new()Time::operator new()来分配内存块,并且随后调用Time::Time(),其中this被设置为该内存块内的地址(也作为new的结果返回),然后将其存储在t中。这通常是在堆上完成的(默认情况下),并且要求您稍后在程序中执行delete,而t中的指针通常存储在堆栈上。

    • 注意:*我在这里使用general是指通用的实现。C++标准并不区分栈和堆作为机器的一部分,而是根据它们的生存期来区分。局部作用域中的变量被称为具有"自动存储持续时间",因此在局部作用域结束时被销毁;而用new创建的对象被称为具有"动态存储持续时间",并且仅在delete d时才销毁。实际上,这意味着自动变量在堆栈上创建和销毁,动态对象存储在堆上, 但这不是语言所要求的 *。
9jyewag0

9jyewag02#

一个更明显的区别是在访问t的变量和方法时。

Time t (12, 0, 0);
t.GetTime();

Time* t = new Time(12, 0, 0);
t->GetTime();
zzoitvuj

zzoitvuj3#

就构造函数而言,这两种形式在功能上是相同的:它们只会导致构造函数在一个新分配的对象示例上被调用,你似乎已经很好地理解了分配模式和对象生存期的区别。

eoxn13cs

eoxn13cs4#

我想你已经理解了所有的区别,假设你很清楚通过指针和通过变量访问t的成员的语法区别(嗯,指针也是一个变量,但我想你明白我的意思),同时假设你知道在传递t给函数时,传值调用和传引用调用的区别。我想你们也知道,如果你把t赋给另一个变量,然后改变另一个变量,结果会不同,取决于t是否是指针。

flvtvl50

flvtvl505#

  • 使用new:调用operator new函数获取动态内存,然后调用constructor函数。
  • 不使用新的:不调用运算符new函数,直接调用构造函数。直接使用堆栈,不使用malloc。
pepwfjgg

pepwfjgg6#

在堆栈上分配对象和在堆上分配对象在功能上没有区别,都将调用对象的构造函数。
顺便说一句,我建议您使用boost的shared_ptr或scoped_ptr,它们在堆上进行分配时功能也是等效的(scoped_ptr的额外用处是限制您复制不可复制的指针):

scoped_ptr<Time> t(new Time(12, 0, 0));
rpppsulh

rpppsulh7#

与你已经知道的没有其他区别。
假设您的代码正在使用默认运算符new的服务。

11dmarpk

11dmarpk8#

No ..没有其他区别..

k5ifujac

k5ifujac9#

void foo (Time t)
{
  t = Time(12, 0, 0);
}

void bar (Time* t)
{
  t = new Time(12, 0, 0);
}

int main(int argc, char *argv[])
{
  Time t;
  foo(t);//t is not (12,0,0),its value depends on your defined type Time's default constructor. 

  bar(&t);//t is (12,0,0)
  return 0;
}

相关问题