0

0

可变长数组在C++中如何实现 动态内存分配与realloc的使用

P粉602998670

P粉602998670

发布时间:2025-07-03 09:13:01

|

351人浏览过

|

来源于php中文网

原创

c++++中手动实现可变长数组需使用new/delete管理内存,1.初始分配固定大小内存并维护size与capacity;2.当size超过capacity时,分配原两倍的新内存;3.拷贝旧数据并释放旧内存;4.更新capacity。例如插入第5个元素时,将容量从4扩容至8。此方法优点是控制精细,缺点易出错。虽然可用realloc但不推荐用于非pod类型,因其不调用构造/析构函数且需注意检查返回值、内存来源等问题。建议封装类管理逻辑,如定义包含data、size、capacity的结构体,并实现push_back及resize方法。总之,手动实现较繁琐且易错,若无特殊需求应优先使用std::vector。

可变长数组在C++中如何实现 动态内存分配与realloc的使用

在C++中实现可变长数组,主要依赖于动态内存分配。虽然C++标准库已经提供了 std::vector 这样的容器来自动管理动态数组,但在某些特定场景下,比如嵌入式开发或性能敏感的底层代码中,我们仍然需要手动实现类似机制。

可变长数组在C++中如何实现 动态内存分配与realloc的使用

实现的核心在于使用 newdelete[] 来申请和释放内存,并在容量不足时重新分配更大的内存空间,把旧数据拷贝过去,再释放旧内存——这一步类似于 C 语言中的 realloc 功能。

可变长数组在C++中如何实现 动态内存分配与realloc的使用

使用 new/delete 手动实现动态扩容

要实现一个简单的可变长数组,基本思路如下:

立即学习C++免费学习笔记(深入)”;

  • 初始分配一定大小的内存(例如 4 或 8 个元素)
  • 维护两个变量:size 表示当前已使用的元素数量,capacity 表示当前分配的总空间
  • 当插入新元素导致 size >= capacity 时,进行扩容操作:
    • 分配新的、更大的内存空间(通常是原来的两倍)
    • 将旧数据复制到新内存
    • 释放旧内存
    • 更新 capacity

举个例子,如果你维护的是一个 int 类型的动态数组,初始容量为 4,当第 5 个元素要插入时,就要重新分配 8 个 int 的空间。

可变长数组在C++中如何实现 动态内存分配与realloc的使用

这种方式的优点是控制更精细,缺点是容易出错,比如忘记拷贝数据、忘记释放旧内存、或者指针未更新等。


realloc 能不能用?有什么问题?

在 C++ 中也可以使用 C 标准库的 mallocrealloc,但不推荐用于对象类型,尤其是带有构造/析构函数的类类型。

Noya
Noya

让线框图变成高保真设计。

下载

原因很简单:

  • realloc 只做内存拷贝,不会调用构造函数和析构函数
  • 如果你用它处理非 POD(Plain Old Data)类型的数据,行为是未定义的

不过对于像 intchar 这样的基础类型来说,还是可以用的。只是要注意以下几点:

  • 每次 realloc 后要检查返回值是否为 NULL,防止内存分配失败
  • 原始内存必须是通过 malloc / calloc 分配的,不能混用 newrealloc
  • 不要直接将返回结果赋给原指针,否则一旦失败会导致原指针丢失

所以,如果你想写一个兼容性更强的动态数组,最好还是坚持使用 C++ 的 newdelete[]


简单封装一个动态数组结构

如果你不想每次都从头开始写,可以简单封装一个结构体或类来管理这些逻辑。比如:

struct DynamicArray {
    int* data;
    int size;
    int capacity;

    DynamicArray() : data(new int[4]), size(0), capacity(4) {}

    ~DynamicArray() {
        delete[] data;
    }

    void push_back(int value) {
        if (size == capacity) {
            resize(capacity * 2);
        }
        data[size++] = value;
    }

private:
    void resize(int new_capacity) {
        int* new_data = new int[new_capacity];
        for (int i = 0; i < size; ++i) {
            new_data[i] = data[i];
        }
        delete[] data;
        data = new_data;
        capacity = new_capacity;
    }
};

这段代码虽然简陋,但展示了手动实现动态数组的基本模式。你可以根据需求扩展更多功能,比如插入、删除、索引访问等。

基本上就这些。手动实现可变长数组不算复杂,但确实容易忽略一些细节,比如边界判断、内存释放时机等。如果不需要特别定制,还是建议优先使用 std::vector

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

229

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

434

2024.03.01

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

193

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

185

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

312

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

522

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

48

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

190

2025.08.29

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号