创建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,第二个原因是这个问题的关键。

    链接地址: http://www.djcxy.com/p/13797.html

    上一篇: Creating C++ objects

    下一篇: C++ Pointer Objects vs. Non Pointer Objects