【问题标题】:Difference between dynamic allocation and ordinary pointers in cppcpp中动态分配和普通指针的区别
【发布时间】:2021-12-09 10:55:15
【问题描述】:

以下表达式有问题:

MyClass *myObject;

MyClass *myObject = new MyClass();

它们之间有什么区别?

【问题讨论】:

  • Why is a raven like a writing desk?(C) 爱丽丝梦游仙境。
  • 指针是指针是指针。它不关心它指向的内存是如何分配的。例如:MyClass myStackObject; MyClass *myObject = &myStackObject; 也是有效的
  • 一个已初始化,一个未初始化。
  • 第一个的含义取决于上下文。如果它在文件范围内,myObject 是一个零初始化指针(即一个空指针,它不指向任何对象,因此取消引用它会给出未定义的行为)。如果它在一个功能块或一个类或结构成员的声明中,myObject 是一个未初始化的指针(它的值是不确定的,简单地访问它的值会给出未定义的行为)。第二行初始化myObject,因此它指向一个动态分配的对象。

标签: c++ pointers initialization declaration new-operator


【解决方案1】:

不同的是:

  • MyClass *myObject; 中,myObject 未初始化,因此没有指向任何有意义的东西

  • MyClass *myObject = new MyClass(); 中,myObject 被初始化为指向new 创建的对象。

【讨论】:

    【解决方案2】:
    int a;
    

    它有什么有意义的价值吗?什么都没有,因为 'a' 没有被初始化。

    int a = 5;
    

    它有什么有意义的价值吗?是的。 'a' 已初始化为值 5。

    同理

    MyClass *myObject;
    

    它有什么有意义的价值吗?不,myObject 未初始化。所以它有一些垃圾/随机值。

    MyClass *myObject = new MyClass();
    

    它有什么有意义的价值吗?是的。已经动态分配了足够的内存来保存“Myclass”,并且 myObject 指向分配内存的开始。

    【讨论】:

    • 请记住,大多数时候不需要newMyClass myObject; 将提供一个 MyClass 实例,无需指针或动态分配。
    【解决方案3】:

    不同之处在于MyClass * 类型指针的一个声明没有显式初始化器,而另一个有显式初始化器。

    在此声明中

    MyClass *myObject;
    

    如果在没有存储类说明符 static 的块范围内声明指针,则指针未初始化且具有不确定值。

    如果在命名空间中声明或使用存储类说明符static 声明,则将其初始化为空指针。也就是说,在这种情况下,声明等同于

    MyClass *myObject = nullptr;
    

    在此声明中

    MyClass *myObject = new MyClass();
    

    指针由动态分配对象的地址初始化。

    你也可以像这样重写最后一个声明

    auto myObject = new MyClass();
    

    因为名称myObject 的类型将从表达式new MyClass() 的初始值设定项推导出来。

    注意这个声明可以拆分

    MyClass *myObject = new MyClass();
    

    分成两个语句

    MyClass *myObject;
    myObject = new MyClass();
    

    【讨论】:

    • 感谢您的回复。想象一下,我们在名为 testFunction() 的类中有一个方法,在这两个声明中我们都可以编写:myObject->testFunction();这就是为什么我有点困惑。我的意思是有/没有初始化我们可以使用那个对象。
    • @Ali 使用具有不确定值的指针调用成员函数时,这是未定义的行为。
    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 2019-07-12
    • 2015-02-05
    相关资源
    最近更新 更多