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

时间:2014-12-31 14:31:49

标签: c++ memory-management

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

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

我的主张:

  1. 左侧部分(ptr)是静态内存分配。
  2. 右侧部分(new int)是动态内存分配。
  3. //新编辑:2015年1月1日17:39(UTC +08:00)
    我在想的是, 它将堆栈的指针向下移动(或向上移动?)以释放ptr的空间。 并找到new int的空白区域。 然后将此new int的地址存储到ptr

4 个答案:

答案 0 :(得分:2)

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

你想:

int * ptr = new int;

或者如果你想进行静态分配

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

答案 1 :(得分:0)

您的主张是正确的。

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

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

  4.   

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

答案 2 :(得分:0)

我想解释有关您的代码的一些事情。

部分

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.

答案 3 :(得分:-2)

因为你将一个类型的变量初始化为' int' rvalue类型' int *'这是无效的。您应该将后者投射到' size_t'它应该工作。

int ptr = (size_t)new int;

之后访问' ptr'的实际值你应该写:

*(int*)ptr

生命example