在c ++中扩展数组

时间:2014-02-07 13:39:28

标签: 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;
}

好吧,如果我在大型程序中使用这种方法,有什么问题吗?为什么人们说这是不可能的?如果是因为扩展区域可能已经填满了其他信息或其他任何内容? 我只是想知道上述方法是否正确。如果没有,那究竟是为什么?

4 个答案:

答案 0 :(得分:4)

这有时会起作用,因为写入尚未分配的内存是未定义的行为。最终写下一个数组的结尾会让你遇到分段错误,当操作系统杀死你时,你会感到顽皮。

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

可以使用realloc来调整数组大小,但可能会将其复制到新位置。 然而无法realloc创建的内容使用new!它必须已与malloc和朋友分配。 newnew[]必须与deletedelete[]malloc一起使用,朋友必须使用free

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

简而言之,直接分配和调整数组的大小充满了陷阱,当我们拥有一个在std::vector中自动执行正确操作的精彩课程时,这是不值得的。

答案 1 :(得分:2)

它不时地运行而不会崩溃,然后崩溃......使用/覆盖你自己没有分配的内存是危险的。这是在野外高度利用的臭虫的理想来源。

根据您的情况,您可以保证阵列的10个元素属于您。然而,*(p+len)=1000;这一行纯粹是邪恶的。因为那段记忆可能会分配给其他人。

我强烈建议你学习和使用valgrind。

答案 2 :(得分:0)

  好吧,如果我在大型程序中使用这种方法,有什么问题吗?

是的,你会泄漏内存。每次拨打new()都应该有相应的delete电话。 另请注意,除了使用new()分配的内容之外,您正在写入内存,这是一个让您的代码意外行为的调用。

使用std::vector<>代替,将为您正确进行内存管理。

答案 3 :(得分:0)

不,上述方法不对。 *(p + len) = 1000; // extend here.行会覆盖尚未分配的连续内存区域,因此如果您运气好,或者可以继续使用损坏的堆,您的程序可能会立即崩溃,这可能会更加麻烦。 这里的另一个问题是你没有释放分配的资源,所以如果你将使用更大的数据,你将遇到更大的内存泄漏。 也许请检查'vector'。