C++摒弃了C中的realloc()函数

在C语言中,realloc()函数可以改变已分配内存区的大小。但是在C++中并不提供类似功能的函数。

如果你需要,你当然可以使用realloc()。但是,realloc()仅仅保证能工作于这样的数组之上:它们被malloc()(或者类似的函数)分配,包含一些没有用户定义的复制构造函数(copy constructors)的对象。而且,要记住,与通常的期望相反,realloc()有时也必须复制它的参数数组。

C++中,处理内存重新分配的更好的方法是,使用标准库中的容器,例如vector,并让它自我增长。

C++里没有realloc不是遗憾,而是精心选择和淘汰的结果。 在C里,realloc的实现(在增加空间的时候)一般而言是重新分配一块空间,   (这是由堆分配的策略决定的),  然后把旧空间的内容copy到新空间里去。而对象空间怎么copy?   是copy字节还是用copy   constructor?  无论哪个都不合适。

那种想在原地(即首地址不动)就把申请内存空间扩大的思想不是一个好思想。

所以不要过多纠结于如何在内置数组或指针基础上找类似于realloc()函数改变已分配内存区大小的函数了。

如果实在想做类似于realloc()函数的操作,可参考如下代码:

#include<iostream>
using namespace std;

int main()
{
    int *oldbuf=new int[5];
    int *newbuf=new int[10];
    for(int i=0;i<5;i++)
    {
        oldbuf[i]=i;
    }
    copy(oldbuf,oldbuf+5,newbuf);
    delete[] oldbuf;
    for(i=5;i<10;i++)
    {
        newbuf[i]=i;
    }
    for(i=0;i<10;i++)
    {
        cout<<newbuf[i]<<endl;
    }
    return 0;
}

`realloc` 函数是 C 标准库中的一个重要内存管理函数,用于动态调整之前分配的内存块大小。它的声明位于 `<stdlib.h>` 中。 ### `realloc` 的基本语法 ```c void *realloc(void *ptr, size_t new_size); ``` #### 参数说明: - **`ptr`**:指向先前通过 `malloc()`、`calloc()` 或 `realloc()` 分配的内存区域的指针。如果传入的是 `NULL`,则 `realloc()` 行为等同于 `malloc(new_size)`,即分配新的内存并返回其地址。 - **`new_size`**:指定新分配内存空间的字节数。若该值小于原有内存,则多余部分会被截断;若大于原尺寸,则会尝试扩充。当设置为0时,并非所有平台都保证释放内存(尽管大多数情况下如此),因此最好显式地调用 free() 来释放不再需要的空间。 #### 返回值: - 成功时返回一个新的指向已重新分配(可能移动了位置)后的内存区块的指针; - 如果请求失败或试图将 NULL 指针作为第一个参数传递并且无法分配所需内存量,则返回 NULL 并保持原始缓冲区不变。 ### 使用示例: 假设我们有一个整型数组,最初只包含三个元素... ```c int main(){ int i; // 初始分配可以存储3个整数的空间 int* arr = (int*) malloc(3 * sizeof(int)); for(i=0; i<3; ++i){ arr[i] = i + 1; } printf("Before realloc:\n"); for(i=0; i<3; ++i) { printf("%d ", arr[i]); } putchar('\n'); // 尝试增加到5个元素 arr = (int *)realloc(arr, 5*sizeof(int)); if(!arr){ // Check if reallocation failed. puts("Memory reallocation failed."); return -1; } else { // 初始化新增加的部分 for(; i<5; ++i) arr[i]=-(i+1); printf("After realloc:\n"); for(i=0; i<5; ++i) { printf("%d ", arr[i]); } } free(arr); // 最终记得释放内存 } ``` 此程序首先创建了一个只能容纳三名成员的小队列,然后通过 `realloc` 扩展它以接受两个额外成员,并初始化它们各自的负数值表示法。 请注意,在实际应用中应当检查每次从 `realloc` 接收的结果是否成功以及处理潜在错误情况下的资源清理工作,避免造成内存泄漏或其他异常状况发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值