-9

我有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

为什么 LHS 上总是有一个指针变量?

Q2。声明和分配带有和不带有运算符的指针有什么区别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对数组使用运算符是什么?

4

2 回答 2

2

为什么 LHS 上总是有一个指针变量?

因为new-expression会产生一个指针。

声明和分配带有和不带有运算符的指针有什么区别new

new-expression (not operator new) 构造一个新对象(并且可以选择为其分配内存)。

我们可以在没有 new 运算符的情况下执行此操作,如下所示

事实上,根据 C++ 标准,我们不能。一些编译器只允许这种结构作为非标准语言扩展

每一本适合初学者的好 C++ 书籍都会更详细地解释这些内容。

于 2020-08-04T06:22:40.837 回答
1

在 C++ 中,典型的表达式在堆上new分配内存,并返回指向该内存的指针。

关于 Q1:您可以将生成的指针保存到局部变量以供立即使用:pointer_variable = new int. 但是您不必这样做:您可以将其用作函数的参数:use_pointer(new int)

关于Q2:您的代码int在堆上分配一个,将其指针存储在局部变量q中,并立即用局部变量的地址覆盖它b。所以你在这里所做的是写一个小的内存泄漏。

关于 Q3:可变大小数组是 C++ 的非标准扩展,因此它不一定适用于其他编译器。但是,当它起作用时,它只是另一个自动变量:当您离开本地范围时,它将自动重新分配以供重复使用。这与分配不同,new分配会持续到它们被显式delete编辑。

于 2020-08-04T06:36:50.693 回答