C++新运算符

C++ new operator

本文关键字:运算符 C++      更新时间:2023-10-16

假设我有一个

class A
{
  int A1;
  void Af();
};

然后我做:

A  hA;
A* pA = new A();

现在,hA是堆栈中的一个对象;我可以使用

hA.A1 = 52 // for example

pA只是指向class A,这怎么有用或方便?(有什么例子吗?)

第二期:

当我做A* pA = new A();我在堆里分配了什么吗?背景中有malloc()吗?如果没有,为什么不呢?为什么int*p_array=new int[5]会在5 int的堆中分配内存,而不是A*pA=new A()?

A  hA = new A();

导致编译器错误。定义"堆栈上"变量的正确方法是

A ha;

但pA只指向A类,这有什么用处或少数(请举几个例子?)

在内存中的某个位置,你有一个类型为A的对象,pa指向它。如果你想将该对象的A1成员设置为52,你可以写

pA->A1 = 52;

为什么它是有用的部分并不是一个真正的问题。

当我做A*pA=新的A()时;我在堆里分配了什么吗?

是的,你做到了。new做两件事:分配内存和调用构造函数。

后台有malloc()吗?

这是未指定的,但在许多实现中,new是通过malloc 实现的

为什么int[]A=A[42]会在42 int的堆中分配内存,而不是ApA=new A()?

这也是一个编译器错误。你的意思是

int* A = new A[42];

这是operator new[],它在堆上分配数组,并在必要时调用构造函数(如果是int,则不是)。

当编译时容量或数据量未知时,对象指针的一次性使用。一个很好的例子是接收来自用户的文本。用户会输入5个字符,10,1k吗?

如果我的程序分配了1k,而用户输入的字符永远不会超过32个,这就是浪费空间。

动态内存分配的另一个用途是在对象之间传递信息:
对象1创建了一本书,但不负责销毁它。
对象2校对这本书,生成一个更正列表,但不会破坏这本书
对象3将表添加到书中,但仍然不会破坏它。
对象4保存书籍,然后销毁。

有关常见C++问题的快速答案,请阅读"C++常见问题解答"。

pA只是指向class A,这怎么有用或方便?(有什么例子吗?)

事实并非如此。pA指向一个A对象,所以*pA是一个对象,就像hA是对象一样:

(*pA).A1 = 52 // for example

当您执行A* pA = new A()时,是的,会发生动态分配。不一定是对malloc()的调用,而是一些东西。(忽略用户定义的operator new的使用,它可以做任何你喜欢的事情)

new A()主要做两件事。它在某个地方为对象分配空间。如果成功,那么它将构造您在该位置请求的类型的对象。如果对象构造成功,那么它只返回一个指向该对象的指针。

但pA只指向A类,这有什么用处或方便?(有什么例子吗?)

它既有用又方便,因为现在您有了类A的实例的地址,该实例不存在于堆栈中,而是存在于堆中。因此,如果您超出范围(从函数返回等等),它将存活下来。你可以把指针传得到处都是,你的实例仍然是

当我做A*pA=新的A()时;我在堆里分配了什么吗?后台有malloc()吗?

是的,是的,这就是新操作员的重点。