C ++中的静态和动态内存分配

这个问题在这里已经有了答案:

  • 为什么我应该使用指针而不是对象本身? 22个答案

  • 左边是一个int ,右边是创建一个int * (指针)

    你要:

    int * ptr = new int;
    

    或者如果你想做静态分配

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

    你的声明是正确的。

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

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

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


    我想解释一些关于你的代码的东西。

    那个部分

    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.
    
    链接地址: http://www.djcxy.com/p/31637.html

    上一篇: Static and dynamic memory allocation in C++

    下一篇: C#: Pixel width matching text rendered in a browser