我有3个问题:
Q1。当我们使用new
运算符创建对象时,语法如下:
pointer_variable = new data-type //To create an object
pointer_variable = new data-type(value); //To create an object with value
pointer_variable = new data-type[size]; //To create an array
为什么在L.H.S上总是有一个指针变量?
第二季度。在有和没有new
运算符的情况下声明和分配指针之间有什么区别?
请考虑以下代码段并输出以理解该问题:
int a = 10, b=20;
int *p;
p = &a;
int *q = new int;
q = &b;
cout<<"P is: "<<p<<" : "<<*p<<endl<<"Q is: "<<q<<" : "<<*q<<endl;
以上代码的输出:
P is: 0x61ff04 : 10
Q is: 0x61ff00 : 20
Q3。当我们说时,使用new
运算符可以在运行时动态地为数组分配内存,而我们在编译时不知道数组的大小。我们可以在没有new
运算符的情况下执行此操作,如下所示:
cout<<"Enter the size of an array"<<endl;
int n;
cin>>n;
int arr[n];
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
for(int i=0;i<n;i++)
{
cout<<arr[i];
}
那么对数组使用new
运算符到底是什么呢?
答案 0 :(得分:2)
为什么在L.H.S上总是有一个指针变量?
因为 new
-表达式产生一个指针。
使用和不使用
new
运算符声明和分配指针之间有什么区别?
new
-表达式(不是operator new
)构造一个新对象(并可以选择为其分配内存)。
我们可以在没有新操作符的情况下执行此操作
实际上,根据C ++标准,我们不能。一些编译器只是允许将此构造作为非标准语言扩展。
每个good C++ book for beginners都会详细解释这些内容。
答案 1 :(得分:0)
在C ++中,典型的new
表达式在堆上分配内存,并返回指向该内存的指针。
问题Q1:您可以将结果指针保存到本地变量以供立即使用:pointer_variable = new int
。但是您不必这样做:您可以将其用作函数use_pointer(new int)
的参数。
第二季度:您的代码在堆上分配了一个int
,将其指针存储在局部变量q
中,并立即用局部变量b
的地址覆盖了它。因此,您在这里所做的就是写一个小的内存泄漏。
第3季度:可变大小数组是C ++的非标准扩展,因此不一定会在其他编译器中工作。但是,当它起作用时,它只是另一个自动变量:当您离开本地范围时,它将自动取消分配以重新使用。这与new
分配不同,后者一直持续到明确delete
编辑。