我注意到有两种方法可以创建C++对象:
BTree *btree = new BTree;和
BTree btree;据我所知,唯一的区别是如何访问类对象(.vs. ->运算符),并且当使用第一种方式时,私有整数被初始化为0。
哪种方式更好,有什么区别?
你怎么知道什么时候使用其中一个呢?
发布于 2010-05-02 09:00:24
两个区别:
在第二种情况下,对象在其封闭作用域(方法、方法内嵌套块或类)结束时自动释放(
使用哪种方法在很大程度上取决于对象的生命周期(它是否应该比创建它的方法更长)。
发布于 2010-05-02 08:57:02
第一种形式在堆上创建对象,而第二种形式在堆栈上创建对象。
第二个from将在函数运行结束时被销毁。第一个将保持活动状态,直到被特别删除。
如果您只想在当前作用域中使用对象,那么第二种形式是最好的。你不需要担心摆脱它,因为它会为你完成。还要注意的是,如果在堆栈上创建了一些类,则某些库将无法工作。
如果对象的寿命比函数长,那么新的表单是更好的选择。
发布于 2010-05-02 09:48:55
这两种形式之间的另一个区别是为这些对象分配存储的时间。BTree bTree;的形式命名为静态分配,它的分配在编译时完成--也就是说,编译器在运行时会在内存中为这个对象安排内存空间。而BTree *pbTree = new BTree的分配,即所谓的动态分配--在运行时执行--也就是说,只有当运行的程序达到这一点时,才会分配内存。
在这种情况下,静态分配和动态分配之间的区别并不明显。考虑以下情况,您需要为整数数组分配内存空间,但元素的数量只能在运行时确定,即我们只能在程序开始执行后才能知道数组消耗的确切内存空间。
// 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在最近的语言规范中是允许的,第二个原因是这个问题的关键。
https://stackoverflow.com/questions/2752084
复制相似问题