好吧,我在互联网上搜索了有关动态扩展数组的信息,发现在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调整数组的大小,但是有可能将其复制到新位置。 但是无法在您使用realloc创建的内容上使用new!它必须已经分配了malloc和好友。 newnew[]必须与deletedelete[]一起使用,malloc和 friend 必须与free一起使用。

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

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

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

10-11 22:38
查看更多