C++ 使用new来分配内存

  对地址的工作方式有一定了解后,来看看它如何实现在程序运行时分配内存。前面我们都将指针初始化为变量的地址;变量是在编译时分配的有名称的内存,而指针只是为可以用过名称直接访问的内存提供了一个别名。指针真正的用武之地在于,在运行阶段分配未命名的内存以存储值。在这种情况下,只能通过指针来访问。在C语言中,可以用库函数malloc()来分配内存;在C++中仍然可以这样做,但C++还有更好的方法——new运算符。

  下面来试试这种新技术,在运行阶段为一个int值分配未命名的内存,并使用指针来访问这个值。这里的关键所在是C++的new运算符。程序员要告诉new,需要为哪种数据类型分配内存;new将找到一个长度正确的内存块,并返回该内存块的地址。程序员的责任是将该地址赋给一个指针。下面是一个这样的示例:

  int * pn = new int;

  new int告诉程序,需要适合存储int的内存。new运算符根据类型来确定需要多少字节的内存。然后,他找到这样的内存,并返回其地址,接下来,将地址赋给pn,pn是被声明为指向int的指针。现在,pn是地址,而*pn是存储在那里的值。将这种方法与将变量的地址赋给指针进行比较:

  int higgens;

  int * pt = &higgens;

  在这两种情况,(pn和pt)下,都是将一个int变量的地址赋给了指针。在第二种情况下,可以通过名称higgens来访问该int,在第一种情况下,则只能通过该指针进行访问。这引出了一个问题:pn指向的内存没有名称,如何称呼它呢?我们说pn指向一个数据对象,这里的“对象”不是“面向对象编程”中的对象,而是一样“东西”。术语“数据对象”比“变量”更通用,它是的是为数据项分配的内存块。因此,变量也是数据对象,但pn指向的内存不是变量。乍一看,处理数据对象的指针方法可能不太好用,但它使程序在管理内存方面有更大的控制权。

  为一个数据对象(可以是结构,也可以是基本类型)获得并指定分配内存的通用格式如下:

  typeName * pointer_name = new typeName;

  需要在两个地方指定数据类型:用来指定需要什么样的内存和用来声明合适的指针。当然,如果已经声明了相应类型的指针,则可以使用该指针,而不用再声明一个新的指针。以下程序演示了如何将new 用于两种不同的类型。

  

#include <iostream>
int main()
{
using namespace std;
int nights = 1001;
int* pt = new int; //allocation space for an int
*pt = 1001; // store a value there

cout << "nights value = ";
cout << nights << ": location = " << &nights << endl;
cout << "int ";
cout << "value = " << *pt << ": location = " << pt << endl;
double* pd = new double; // allocate space for a double
*pd = 1000001.0; // store a double there

cout << "double ";
cout << "value = " << *pd << " : location = " << pd << endl;
cout << "location of pointer pd: " << &pd << endl;
//cout << "size of pt = " << sizeof(pt);
cout << "size of pt = " << sizeof pt;
cout << ": size of *pt = " << sizeof(*pt) << endl;
cout << "size of pd = " << sizeof pd;
cout << ": size of *pd = " << sizeof (*pd) << endl;
return 0;

}

  下面是该程序的输出:

  nights value = 1001: location = 0113F864
  int value = 1001: location = 0153A138
  double value = 1e+06 : location = 01544338
  location of pointer pd: 0113F84C
  size of pt = 4: size of *pt = 4
  size of pd = 4: size of *pd = 8

  当然,内存位置的标准值对系统而异。

  程序说明

  该程序使用new分别为int类型和double类型的数据对象分配内存。这是在程序运行时进行的。指针 pt 和 pd 指向这两个数据对象。如果没有它们,将无法访问这些内存单元。有了这两个指针,就可以像使用变量那样使用*pt和*pd来显示这些值。

  该程序还指出了必须声明指针所指向的类型的原因之一。地址本身只指出了对象存储地址的开始,而没有指出其类型(使用的字节数)。从这两个值的地址可以知道,它们都只是数字,并没有提供类型或长度信息。另外,指向int的指针的长度与指向double的指针相同。它们都是地址,但由于use_new.cpp声明了指针的类型,因此程序知道*pd是8个字节的double值,*pt是4个字节的int值。use_new.cpp打印*pd的值时,cout知道读取多少字节以及如何解释它们。

  对于指针,需要指出的另一点是,new分配的内存块通常与常规变量声明分配的内存块不同。变量nights和pd的值都存储在被称为栈(stack)的内存域中,而new从被称为堆(heap)或自由存储区(free store)的内存区域分配内存。

  内存被耗尽?

  计算机可能会由于没有足够的内存而无法满足new的请求。在这种情况下,new通常会引发异常,而在较老的实现中,new将返回0。在C++中,值为0的指针被称为空指针(null pointer)。C++确保空指针不会指向有效的数据,因此它常被用来表示运算符或函数失败(如果成功,它们将返回一个有用的指针)。将在if语句可帮助您处理这种问题;就目前而言,您只需如下要点:C++提供了检测并处理内存分配失败的工具。

原文链接: https://www.cnblogs.com/wjq13752525588/p/15916894.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++ 使用new来分配内存

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/188024

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午1:56
下一篇 2023年2月12日 下午1:57

相关推荐