创建C ++对象
我注意到有两种方法来创建C ++对象:
BTree *btree = new BTree;
和
BTree btree;
从我所知道的,唯一的区别在于如何访问类对象(.vs - > - operator),并且当使用第一种方法时,私有整数被初始化为0。
哪种方式更好,有什么区别?
你怎么知道什么时候使用其中一种?
两个区别:
他们在内存的不同部分创建对象(堆vs堆栈)
对象的生命周期是不同的:在第一种情况下,代码显式地管理内存分配, 并且它还必须明确地管理释放 (使用delete / delete [])。
在第二种情况下,该对象会在其封闭范围(方法,方法内的嵌套块或类)内自动释放,
你使用哪一个主要取决于对象的生命周期(如果它应该超过创建它的方法)。
第一种形式在堆上创建对象,而第二种形式在堆上创建它。
当功能完成运行时,第二个将被销毁。 第一个将保持存在直到被删除。
如果只想使用当前范围中的对象,则第二种形式最好。 你不必担心摆脱它,因为它会为你完成。 另请注意,如果在堆栈上创建了类,某些库不起作用。
如果对象应该超过该功能,则新表单是更好的选择。
这两种形式的另一个区别是分配这些对象的存储时间。 BTree bTree;
形式BTree bTree;
在编译时指定分配完成的静态分配 - 即编译器在运行时会为内存中的此对象安排内存空间。 而对于BTree *pbTree = new 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,第二个原因是这个问题的关键。
上一篇: Creating C++ objects