【问题标题】:Static and dynamic memory allocation in C++ [duplicate]C ++中的静态和动态内存分配[重复]
【发布时间】:2015-02-27 14:58:12
【问题描述】:

为什么下面的猜测是错误的? (一位软件工程公司经理告诉我,这几乎是正确的,但我不明白为什么,我无法在互联网上搜索答案..)

int* ptr = new int;      // Sorry I mistyped before

我的主张:

  1. 左边部分 (ptr) 是静态内存分配。
  2. 右边部分(new int)是动态内存分配的。

// 新编辑:2015 年 1 月 1 日 17:39 (UTC +08:00)
我在想的是, 它将堆栈指针向下(或向上?)移动以释放ptr 的空间。 并为new int 找到一个空白空间。 然后将这个new int的地址存入ptr

【问题讨论】:

  • 你必须阅读指针,这里有一个很好的视频来理解指针。 youtube.com/playlist?list=PL2_aWCzGMAwLZp6LMUKI3cc7pgGsasm2_
  • 每一层都错了……首先,为什么你认为动态分配的内存可以分配给静态的(实际上不是静态的)?
  • 如果你的左边部分发生在一个功能块中,它就不是静态内存分配。
  • 这段代码是什么意思?左边说ptr是一个int,但是=右边的东西是一个指针。
  • 致大卫,对不起,我想输入 int* ptr = new int;

标签: c++ memory-management


【解决方案1】:

我想解释一下关于你的代码的一些事情。

部分

new int

被认为是“动态分配”,但实际上它是在堆内存中分配的。

声明

int ptr

不被认为是“静态分配”,而是被认为是“自动”,因为它是在堆栈内存上分配的。 请注意,堆比堆栈大很多(Windows 中每个线程的默认堆栈大小为 1MB), 因此您将无法在堆栈上分配大型数组。 另一方面,堆理论上有 4GB 的内存地址空间,虽然只有 2GB 可供进程使用,而且它也是虚拟内存,当然不是物理内存。

现在,由于您将 ptr 仅表示为整数类型(而不是指针),因此编译器将失败,因为您尝试将内存地址分配给非指针类型。 因此,您需要明确告诉编译器这是您的意图,并通过将内存分配(只是一个 32 位地址)转换为 int 来告诉编译器:

int ptr = (int)new int; //allocate an int on the heap and cast the address to an int value

问题是现在 ptr 将保存一个 32 位数字,它是堆中内存分配的起始地址。 你现在不能用这个 ptr 做很多事情,因为编译器把它当作一个简单的整数而不是一个指针,所以为了用它做一些有意义的事情(而不是仅仅将地址保存在一个整数值中),你需要将其转换为指针并且仅使用它。 例如,用某个值初始化地址(假设值为 5):

(*(int*)ptr) = 5; //cast to pointer and dereference it.

正如您所见,现在的语法变得“丑陋”并且很难阅读/理解。 如果你以“正确”的方式做事,你可以这样写:

int* ptr = new int;

*ptr = 5;  //dereference the pointer

还有一点,关于指针算法: 由于您的 ptr 只是一个整数而不是指针,因此当您增加它时:

int ptr = new int; //Assume ptr got the address 0x010
ptr++;
//Now ptr will hold the value of 0x011 because the value just got incremented by 1.

但如果 ptr 是一个真正的指针:

int* ptr = new ptr; //Assume ptr got the address 0x010
ptr++;
//Now ptr will hold the value of 0x014 because the size of an int is 4 bytes
//and the pointer now points to the next address after the allocated integer.

【讨论】:

    【解决方案2】:

    因为您使用无效的“int *”类型的右值来初始化“int”类型的变量。您应该将后者转换为“size_t”,它应该可以工作。

    int ptr = (size_t)new int;
    

    之后要访问 'ptr' 的实际值,您应该编写:

    *(int*)ptr
    

    生活example.

    【讨论】:

    • /* 你为什么要这样做?为什么不 */ int ptr = (int)new int;
    • 因为以某种方式从指向“int”的指针强制转换丢失数据。
    • 哈哈!然后将值设置为 int 就可以了?
    • 不,但它可以编译。
    • 检查我的答案,这将清除事情。
    【解决方案3】:

    您的声明是正确的。

    1. 左边部分(ptr)是静态内存分配。

    2. 右边部分(new int)是动态内存分配的。

    换句话说,右边部分返回一个int *,一个(动态分配的)指向int的指针。您不能将其分配给 int 类型的(静态分配的)变量。

    【讨论】:

      【解决方案4】:

      左侧是int,右侧是创建int *(指针)

      你想要:

      int * ptr = new int;
      

      或者如果你想做静态分配

      int num; // = 5; Will initialize num to 5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-03
        • 1970-01-01
        • 2014-10-12
        • 2016-02-03
        • 2015-07-23
        • 2012-11-29
        • 2018-10-01
        • 2012-01-13
        相关资源
        最近更新 更多