首页 理论教育 C++STL精解:内存分配与释放

C++STL精解:内存分配与释放

时间:2023-10-25 理论教育 版权反馈
【摘要】:4)当尝试分配必要的内存成功时,或者当被调用的new_handler代表的函数没有返回时,循环会中止。目的是使指针ptr的值无效。这些函数也不可能代替保留的new和delete的特定形式。其目的是执行其他行为。通过采用抛出异常的形式,在new表达式初始化时终止被调用的默认函数。

C++STL精解:内存分配与释放

首先介绍操作符new和delete。

1.单个对象的形式

操作符new的声明形式如下:

使用new表达式实现分配内存空间,参数size代表分配内存的字节大小。该内存代表了对象的大小。

在C++程序中,可以定义任意函数,甚至该函数的命名标识可以取代C++标准库中定义的默认版本。如果分配内存成功,new操作符可以返回一个非空指针;否则,会抛出bad_alloc类型的异常。

操作符new也会执行一些默认的行为法则。

1)执行循环。在循环中,函数通常首先尝试分配必要的内存。而是否尝试调用函数malloc(),也不是特定的。

2)如果尝试成果,会返回指针,该指针指向分配的内存。否则,如果函数set_handler()的最后一个参数是一个空指针,会抛出异常bad_alloc。

3)要不然,函数会调用当前的句柄(new_handler)。如果被调用的函数返回,循环会重复执行。

4)如果分配需要的内存成功或者被调用的函数句柄(new_handler)没有正常返回,循环会中止。

上述代码和第一种new的用法相似。唯一不同的是:当上述形式的new被调用时,C++程序会提供一个空指针作为错误标识,而不是抛出badalloc类型的异常。

同样,任意C++程序均可定义一个函数,该函数可以替换C++标准库中的默认版本。

当使用new()分配适当的内存空间时,返回的是一个非空指针;否则,返回的是一个空指针。操作符new的nothrow版本返回的指针和常规版本返回的指针是一样的。函数的替代版本同样需要满足这个要求。

同样,第二种new操作符也会执行一些默认的行为法则。

1)执行一个循环。在循环执行过程中,函数首先尝试分配必要的内存。该尝试涉及调用标准C库malloc()函数。

2)如果尝试成功,返回指向所分配内存的指针。否则,如果set_new_handler()函数的最后一个参数是空指针,new函数会返回空指针。

3)要不然,函数调用当前的new_handler。如果被调用的函数返回,循环会继续重复执行。

4)当尝试分配必要的内存成功时,或者当被调用的new_handler代表的函数没有返回时,循环会中止。如果通过抛出异常的形式,被调用的new_handler中止,new()函数会返回一个空指针。例如,

操作符delete的两种使用形式:

功能描述:释放内存的功能是通过delete表达式被调用的。目的是使指针ptr的值无效。任一C++程序可能会定义一个函数,该函数命名可以取代C++标准库中的默认版本。之前调用函数new时,指针ptr获取到相应的内存指针或空指针。同样,delete函数也存在以下默认属性。

1)对于空指针,不采取任何措施。

2)当ptr指针是非空数值时,其数值应该是new函数被调用时赋予的值,通过对其调用delete()函数,使该指针无效。对于这样的非空指针,delete()函数执行之后,会收回之前使用默认new()函数开辟的内存。(www.xing528.com)

提示

对于new函数或其他(calloc()、malloc()、realloc()等)函数开辟的内存,并不能确定在什么条件下才能回收这些内存。

2.数组形式(array forms)

功能描述:使用new可以开辟数组形式的内存空间。内存大小是new的参数size,数组的大小应该小于或等于new的参数size。同样,在C++程序中可以定义函数,该函数的签名可以替换C++标准库中的默认版本。函数返回值是指针类型。

功能描述:和上述内容相同,除了在调用new函数失败时,返回空指针之外,并不抛出bad_alloc类型的异常。而new[]函数调用失败之后,会抛出bad_alloc类型的异常。任一C++程序可以定义一个函数,该函数的命名同样可以替换C++标准库中的默认版本(同名)。

两种new[]函数的使用方法是相似的,函数返回值类型是一致的。

功能描述:数组形式的内存释放(delete[])函数在被调用时,主要目的是使该内存指针无效。

对于C++程序,在程序中定义的函数可以替换C++标准库中的同名默认版本。delete[]函数的参数指针ptr允许的值可能是空指针,或者ptr的值是之前调用new[]函数获得的内存指针。同样,在使用delete[]函数时,需要注意的是:

1)如果指针ptr的值是空指针,delete[]函数不执行任何措施。

2)如果指针ptr的值是其他数值,其值应该是之前调用new[]函数时获取的内存指针。对于一个非空值的指针ptr,其之前被分配的内存将被回收。

3)头文件<cstdlib>中声明的内存分配函数主要包括calloc()、malloc()或realloc()。调用这些函数会分配相应的内存,并且无论在什么条件下,使用这些函数可以重新分配de-lete[]回收的内存。

3.Placement forms

在C++库中,有部分函数是保留函数,是不能被自定义的同名函数取代的。这些函数也不可能代替保留的new和delete的特定形式。

形式一:

函数返回指针ptr。其目的是执行其他行为。例如,

形式二:

函数返回值为ptr。其目的是执行其他行为。

形式三:

其目的是不执行任何行为。通过采用抛出异常的形式,在new表达式初始化时终止被调用的默认函数。

形式四:

不执行任何行为。通过采用抛出异常的形式,在new表达式初始化时终止被调用的默认函数。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈