c++ - 在 C++ 中扩展数组

标签 c++ arrays dynamic extend

好吧,我在网上搜索了关于动态扩展数组的内容,发现在 C++ 中是不可能的。我必须使用 C 版本的 mallocrealloc 或 C++ 中的 std::vector。但下面的代码似乎工作得很好。

#include<iostream>
using namespace std;
int main() {
    int len = 10;
    int *p = new int[len];
    for (int i = 0; i < len; i++){
        p[i] = i + 1;
    }
    *(p + len) = 1000; // extend here. 
    len++;
    for (int i = 0; i < len; i++){
        cout << p[i] << endl;
    }
    return 0;
}

那么如果我在大程序中使用这种方式,有什么问题吗?为什么人们说这是不可能的?如果是因为扩展区域可能已经被其他信息或其他东西填满了? 我只想知道上面的做法对不对。如果不是,那究竟是为什么?

最佳答案

这有时会起作用,因为写入未分配的内存是未定义的行为。当操作系统因为调皮而杀死你时,最终注销数组的末尾会让你出现段错误。

如果您需要可调整大小的数组,请使用 C++ std::vector。缺点几乎为零。它为您处理重新分配和取消分配的所有复杂情况。它还会在调整大小时做正确的事情,以便附加到数组的分摊时间为 O(1)。

可以使用realloc 来调整数组的大小,但它有可能被复制到新位置。 但是不能对你用new创建的东西使用realloc!它一定是用 malloc 和 friend 分配的。 newnew[] 必须与 deletedelete[], malloc和 friend 一起去 free

如果您使用 C 函数在 C++ 程序中分配内存,则会遇到其他危险。 C 函数不会在为用户定义或标准库类型分配的数组上运行构造函数。

简而言之,直接分配和调整数组大小充满了陷阱,当我们有一个很棒的类在 std::vector 中自动做正确的事情时,这是不值得的。

关于c++ - 在 C++ 中扩展数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21629230/

相关文章:

c++ - 跨模板实例共享函数

c++ - 正确读取被 ID3 标签打乱的 MP3 文件

c++ - 在无限循环中每 60 秒重置一次变量值

javascript - 将 var 压入数组

c - 用可变数量的参数构建一个字符串

java - 在内存中编译Java

vue.js - 当数据更改时,Vue 不会重新渲染绑定(bind)类

c++ - 调用我的 CLR 项目时 KernelBase.dll 出现未处理的异常

arrays - bash 中的数组运算符

jquery - 根据星期几添加类(class)