Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么时候应该动态或自动实例化对象?_C++_Pointers_Object - Fatal编程技术网

C++ 什么时候应该动态或自动实例化对象?

C++ 什么时候应该动态或自动实例化对象?,c++,pointers,object,C++,Pointers,Object,例如,我应该使用: Foo* object = new Foo ; 还是我应该使用 Foo object ; 如果我把代码弄错了,请更正。现在时间还早,我是个初学者。应尽可能避免使用新的操作员。它在所有领域都是浪费的——语法上、语义上、运行时以及空间和时间上。如果有一个对象可以在堆栈上分配,也可以在类中静态分配,那么就这样做。只有当您需要动态性时,才应该使用动态分配。如果您不需要动态分配,请不要使用动态分配。应尽可能避免使用新操作员。它在所有领域都是浪费的——语法上、语义上、运行时以及空间

例如,我应该使用:

Foo* object = new Foo ; 
还是我应该使用

Foo object ;

如果我把代码弄错了,请更正。现在时间还早,我是个初学者。

应尽可能避免使用新的操作员。它在所有领域都是浪费的——语法上、语义上、运行时以及空间和时间上。如果有一个对象可以在堆栈上分配,也可以在类中静态分配,那么就这样做。只有当您需要动态性时,才应该使用动态分配。如果您不需要动态分配,请不要使用动态分配。

应尽可能避免使用新操作员。它在所有领域都是浪费的——语法上、语义上、运行时以及空间和时间上。如果有一个对象可以在堆栈上分配,也可以在类中静态分配,那么就这样做。只有当您需要动态性时,才应该使用动态分配。如果您不需要它是动态的,就不要使用动态分配。

在第一种情况下,您在堆中分配
Foo
对象,而在第二种情况下,它在堆栈中分配

通常,在以下情况下,在堆中分配内容:

  • Foo太大了,不能放进堆栈中

  • 你不知道什么时候分配你的对象(你只需要在某些情况下分配它)

  • 在堆栈弹出后,还需要延长对象的生存期


在大多数其他情况下(当动态分配对象很有用时,我可能忘记了一些其他常见场景),可能建议在堆栈中分配对象,因为这样在运行时成本更低,更不容易出错,也更容易处理。

在第一种情况下,在堆中分配
Foo
对象,而在第二种情况下,它是在堆栈中分配的

通常,在以下情况下,在堆中分配内容:

  • Foo太大了,不能放进堆栈中

  • 你不知道什么时候分配你的对象(你只需要在某些情况下分配它)

  • 在堆栈弹出后,还需要延长对象的生存期


在大多数其他情况下(我可能忘记了动态分配对象很有用的一些其他常见场景),可能建议在堆栈中分配对象,因为它在运行时成本更低,更不容易出错,也更容易处理。

使用新操作符分配对象后,需要使用delete操作符进行清理。所以在大多数情况下,如果没有必要,我会使用静态实例化


但是,由于静态实例化会将对象放在堆栈上,您可能会遇到内存问题:堆栈只能容纳这么多数据。因此,有时可能需要动态实例化对象。

使用新操作符分配对象需要使用delete操作符进行清理。所以在大多数情况下,如果没有必要,我会使用静态实例化


但是,由于静态实例化会将对象放在堆栈上,您可能会遇到内存问题:堆栈只能容纳这么多数据。因此有时可能需要实例化对象。

< P> C++中的缺省值应该是使用对象本身,而不是指针(智能或其他),除非有特殊的原因否则。 要获取默认构造对象,必须关闭括号:

Foo object;

< >否则,编译器将把它作为函数的声明。

< P> C++中的缺省值应该是使用对象本身,而不是指针(智能或其他),除非有特殊的原因否则。 要获取默认构造对象,必须关闭括号:

Foo object;

否则,编译器将把它作为函数的声明。

第二种用法应该是:

Foo object;
两者的区别在于,第一个是在堆上分配对象,第二个是在堆栈上分配对象。有很多不同之处,但这里有几个:

  • 当您在堆上分配对象时,它将一直处于活动状态,直到您显式删除它,而在堆栈上分配的对象只有在函数结束时才处于活动状态

  • 在堆上分配对象比在堆栈上分配对象更昂贵(就性能而言)

  • 通常,您可以在堆上分配比在堆栈上多得多的对象

  • 堆上分配的对象可以在线程之间传递,而堆栈上分配的对象则不能(这不是100%正确的,当另一个线程处理对象时,您可以使您的函数保持活动状态,但这是非常无用和低效的)

  • 在堆栈上分配的对象将在您进入声明它们的范围后立即分配。有些情况下,您不一定希望总是分配它们,也就是说,您可能更喜欢在堆上使用动态分配


  • 第二种用法应该是:

    Foo object;
    
    两者的区别在于,第一个是在堆上分配对象,第二个是在堆栈上分配对象。有很多不同之处,但这里有几个:

  • 当您在堆上分配对象时,它将一直处于活动状态,直到您显式删除它,而在堆栈上分配的对象只有在函数结束时才处于活动状态

  • 在堆上分配对象比在堆栈上分配对象更昂贵(就性能而言)

  • 通常,您可以在堆上分配比在堆栈上多得多的对象

  • 在堆上分配的对象可以在线程之间传递,而在堆栈上分配的对象则不能(这不是100%正确,您可以使函数