创建C++;物体 我注意到有两种方法来创建C++对象: BTree *btree = new BTree;

创建C++;物体 我注意到有两种方法来创建C++对象: BTree *btree = new BTree;,c++,class,object,g++,C++,Class,Object,G++,及 据我所知,唯一的区别在于类对象的访问方式(.vs.->operator),当使用第一种方式时,私有整数被初始化为0 哪条路更好,有什么区别 你怎么知道什么时候使用其中一个呢?嗯,它们存储在不同的内存区域 这是一本好书。 第一个表单在堆上创建对象,而第二个表单在堆栈上创建对象 函数完成运行后,将销毁第二个。 第一个将保持活动状态,直到被特别删除 如果只想在当前范围内使用对象,则第二种形式最好。你不必担心如何摆脱它,因为它会为你完成的。还请注意,如果在堆栈上创建了类,则某些库不起作用 如果对象应

据我所知,唯一的区别在于类对象的访问方式(.vs.->operator),当使用第一种方式时,私有整数被初始化为0

哪条路更好,有什么区别


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

嗯,它们存储在不同的内存区域

这是一本好书。
第一个表单在堆上创建对象,而第二个表单在堆栈上创建对象

函数完成运行后,将销毁第二个。 第一个将保持活动状态,直到被特别删除

如果只想在当前范围内使用对象,则第二种形式最好。你不必担心如何摆脱它,因为它会为你完成的。还请注意,如果在堆栈上创建了类,则某些库不起作用

如果对象应该比函数寿命长,则新形式是更好的选择。

两个区别:

  • 它们在内存的不同部分创建对象(堆与堆栈)

  • 对象生存期不同: 在第一种情况下,代码显式地管理内存分配,并且它还必须显式地管理释放(使用delete/delete[])

    在第二种情况下,对象在其封闭范围(方法、方法中的嵌套块或类)的末尾自动解除分配


您使用哪种方法主要取决于对象的生存期(如果它应该比创建它的方法更长寿)。

最重要的区别是对象的生存期。例如,如果您正在编写一个视频游戏,您将通过
new
分配堆上怪物对应的对象。这样,怪物的底层对象的寿命与怪物一样长,这在编写程序时是不可知的。当玩家杀死怪物时,你的代码可以使用
delete
摧毁怪物对象

另一方面,总分数计数器,你可以使用另一种形式,因为你知道你希望计数器停留多长时间(大概,只要游戏还在运行!)。通过将该形式放在任何函数体之外的“全局范围”中,它将被静态分配,作为程序二进制本身的一部分

最后,如果计算数组的和,如下所示:

int mysum(int* arr, int len) {
  int sum = 0;
  for (int i = 0; i < len; ++i) { sum += arr[i] }
  return sum;
}
int mysum(int*arr,int len){
整数和=0;
对于(int i=0;i

sum
变量是在堆栈上分配的,这基本上就是您想要的:一个临时变量,您不必显式地取消分配,它只在函数实际运行时出现。

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

在这种情况下,静态和动态分配之间的差异并不明显。考虑下面的情况,您需要为整数数组分配内存空间,但是只有在运行时才能确定元素的数量,即我们只知道程序开始执行后数组所消耗的内存空间。p>
// 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*array\u cpy(int*arr,int num){
int*copy=newint[num];
int i;
对于(i=0;i

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

在选择是堆栈还是堆分配内存时,您需要深入研究两者之间的差异

是的,堆栈内存具有在超出范围时自动释放的优势,尽管智能指针和堆分配也可以实现这一点。更重要的是为什么会发生这种情况

性能: 堆栈内存会自动清理,因为当内存超出范围时,它只涉及堆栈指针的简单移动。因此,堆栈内存的分配和解除分配比堆内存快得多

内存寿命: 堆分配内存的可用性超出了分配函数的范围。堆栈不是。根据上面关于调整堆栈指针的推理,一旦释放内存,它将是空闲的,并且很可能会被覆盖以进行下一次堆栈分配


简言之,当分配是临时的时,尤其是当您需要重复分配并且性能很重要时,请使用堆栈内存。当对象需要存在于分配方法之外时,使用堆内存。

我对堆和堆栈略知一二。为什么我会在乎它放在哪里?我什么时候希望它在堆中,什么时候希望它在堆栈中?堆栈在应用程序中是有限的。堆没有限制(虚拟内存空间)。堆栈也被限制在变量的范围内。堆允许您传递结构,而不考虑范围。此语句是错误的。请不要忽略静态内存。例如a
BTree-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;
}