RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1007423
Accepted
Bakuard
Bakuard
Asked:2020-07-28 14:36:22 +0000 UTC2020-07-28 14:36:22 +0000 UTC 2020-07-28 14:36:22 +0000 UTC

关于C++中指针的几个问题

  • 772

With ++ 中有一些与原始指针相关的问题。考虑以下代码

#include <stdio.h>

struct Point {
    double x, y;
};

int main(void) {
    Point* p = new Point;
    delete p;

    /* 
    * Далее выполняется очень большое кол-во разных
    * действий связанных с созданием разных объектов,
    * включая Point, а также их удалением.
    */

    printf("address = %d, x = %f", p, p->x); //строчка X.

    return 0;
}

问题:

  1. 对于正在创建的下一个对象Point,只分配了指针指向的内存区域p。这样的巧合可能吗?如果是这样,第 X 行会成功吗?

  2. 对于下一个创建的NOT TYPE POINT对象,已经分配了一个内存区域,它的开头只是由指针指向的p。该对象由具有三个字段的结构表示double。可能吗?如果是这样,第 X 行会成功吗?

  3. 对象释放后为其分配的内存区域Point被转移到操作系统,然后成为另一个进程的一部分。这种情况可能吗?如果是 - 纯粹从理论上讲,是否可以通过 p 指针引用另一个进程的数据?

c++
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Harry
    2020-07-28T14:44:20Z2020-07-28T14:44:20Z

    让我们从这不是 C 而是 C++ 的事实开始。

    1.2. 在delete p;, 所指向的内存p是空闲的之后,所以它可以被分配给任何东西(如果相应的连续空闲内存的大小允许的话)。所以你描述的很有可能。请参阅下面的行x。

    1. 不,这是分配给进程的地址空间。您将简单地获得,访问指针,其内存被释放,未定义的行为。

    该行x是半正确的:) - 您可以在任何情况下显示地址 -就像变量的内容一样 p,这并不意味着它是正确的,它可以被访问。仅当p->x您访问正确分配且未释放的内存(或变量的地址 - 例如

    Point pp;
    p = &pp;
    

    )。之后delete p;它就变成了 UB(很明显,在那之后p = &pp;发布本身delete p;就是 UB)。

    如果在删除和输出之间您再次分配p了一个指向已分配内存或对象地址的指针Point,则该行是x正确的。

    简而言之。你可以说得更详细一点,但是...

    • 4
  2. Best Answer
    pepsicoca1
    2020-07-28T17:57:31Z2020-07-28T17:57:31Z

    因此,如果没有什么能阻止我访问位于存储在 p 指针中的地址的相同类型结构的 x 字段 - 如何不执行第 X 行中的脚本?

    第 X 行会被执行,但执行的结果是不可预测的,并且可能总是或有时是错误的。甚至结果也总是不完全正确,而是编写此错误代码的人所期望的。

    问题中给出的代码是错误的代码。它将编译,但运行时会出现错误(如果适当的编译器以良好的方式布置数据结构,则有时可能会发生错误,并且可能永远不会发生错误)。在 C++ 语言的语言级别没有针对此类错误的保护措施。为此(由于缺乏针对此类错误的保护),C ++ 语言受到许多人的批评。但是,如果程序员自己控制这些潜在的错误时刻,C++ 语言允许您编写更高效的程序。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5