【问题标题】:new KeyWord c++ (Assistance Required)new KeyWord c++(需要帮助)
【发布时间】:2016-03-31 14:56:44
【问题描述】:
  1. 我有以下代码可以 100% 正常工作。我也知道,幕后究竟发生了什么。在这种情况下,“新”是如何工作的。

    struct ABC{
        int data = 1234;
    };
    ABC *obj = new ABC;
    cout << "obj->data";
    
  2. 以下代码无法正常编译然后崩溃。没有语法或编译错误。

    struct ABC{
        int data = 1234;
    };
    ABC *obj; // please explain??
    cout << "obj->data";
    
  3. 以下代码也可以正常工作。

    struct ABC{
        int data = 1234;
    };
    ABC *obj, myobj;
    myObj = &obj;
    cout << "obj->data";
    

我也知道,第三个rd 是如何工作的。请解释一下,为什么 2nd 一个不起作用。很抱歉没有创建 main() 程序。

【问题讨论】:

  • 无法复制,打印字符串就可以了。
  • 您确定,“cout data"" 行是用 " 围绕 obj->data 编写的吗?在您的代码中,所有 3 个示例都必须使用 text= 打印相同的字符串“obj->data”仅此而已
  • 如果没有引号,则 2 中的崩溃很容易解释,因为 obj 指向未初始化的内存,并且取消引用它是未定义的行为,通常被视为崩溃。

标签: pointers c++11 struct new-operator


【解决方案1】:

在第一个示例中,您为结构分配内存并通过调用“new”来初始化该结构。并且 obj 将包含该结构内存开头的地址。

在第二个例子中,变量 obj 是一个指针,它没有被初始化。所以它指向一个随机内存地址。

当您尝试从该内存地址(位于 obj 中存储的地址)读取值时,可能会发生两件事:

  1. 如果 obj 指向由操作系统分配给您的程序的内存块,您将收到一些位于此地址的值。
  2. 如果 obj 指向其他内存块,操作系统会发现它并关闭您的应用程序。

在调试配置中构建的程序中,未初始化的变量默认初始化为零。所以你的 obj 将指向地址 0,从中读取被操作系统识别为错误。在 Release 配置中,所有未初始化的变量都不会强制为零 - 每个值都可能存在。

【讨论】:

    猜你喜欢
    • 2011-09-02
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多