int * p和int * p = new int有什么区别?

时间:2020-08-04 06:16:15

标签: c++ new-operator

我有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运算符到底是什么呢?

2 个答案:

答案 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编辑。