首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建C++对象

创建C++对象
EN

Stack Overflow用户
提问于 2010-05-02 08:52:17
回答 6查看 16.3K关注 0票数 14

我注意到有两种方法可以创建C++对象:

代码语言:javascript
运行
复制
BTree *btree = new BTree;

代码语言:javascript
运行
复制
BTree btree;

据我所知,唯一的区别是如何访问类对象(.vs. ->运算符),并且当使用第一种方式时,私有整数被初始化为0。

哪种方式更好,有什么区别?

你怎么知道什么时候使用其中一个呢?

EN

回答 6

Stack Overflow用户

发布于 2010-05-02 09:00:24

两个区别:

  • 他们在内存的不同部分创建对象(堆和栈)
  • 对象的生命周期是不同的:在第一种情况下,代码显式地管理内存分配,,并且它还必须显式地管理释放(使用/delete[])。

在第二种情况下,对象在其封闭作用域(方法、方法内嵌套块或类)结束时自动释放(

使用哪种方法在很大程度上取决于对象的生命周期(它是否应该比创建它的方法更长)。

票数 32
EN

Stack Overflow用户

发布于 2010-05-02 08:57:02

第一种形式在堆上创建对象,而第二种形式在堆栈上创建对象。

第二个from将在函数运行结束时被销毁。第一个将保持活动状态,直到被特别删除。

如果您只想在当前作用域中使用对象,那么第二种形式是最好的。你不需要担心摆脱它,因为它会为你完成。还要注意的是,如果在堆栈上创建了一些类,则某些库将无法工作。

如果对象的寿命比函数长,那么新的表单是更好的选择。

票数 5
EN

Stack Overflow用户

发布于 2010-05-02 09:48:55

这两种形式之间的另一个区别是为这些对象分配存储的时间。BTree bTree;的形式命名为静态分配,它的分配在编译时完成--也就是说,编译器在运行时会在内存中为这个对象安排内存空间。而BTree *pbTree = new BTree的分配,即所谓的动态分配--在运行时执行--也就是说,只有当运行的程序达到这一点时,才会分配内存。

在这种情况下,静态分配和动态分配之间的区别并不明显。考虑以下情况,您需要为整数数组分配内存空间,但元素的数量只能在运行时确定,即我们只能在程序开始执行后才能知道数组消耗的确切内存空间。

代码语言:javascript
运行
复制
// in this function, we want to return a copy of the parameter array
int *array_cpy( int *arr, int num ){
    int *copy = new int[ num ];

    int i;
    for( i = 0; i < num; i++ ){
        copy[ i ] = arr[ i ];
    }

    return copy;
}

这里定义int copy[ num ];是不合适的,一个原因是由于我上面所说的,另一个原因是copy的生命周期比函数的生命周期长。然而,鉴于VLA在最近的语言规范中是允许的,第二个原因是这个问题的关键。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2752084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档