c++ - 'new' 在 C++ 中是如何动态的

标签 c++ arrays memory-management new-operator

使用"new"如何被视为动态?我知道它被放在堆上,返回一个指针并保留下来,但我还没有认识到它在分配方面的“动态”性质。

在下面的情况下,两个数组都是在运行时分配的,即使是静态方法也是如此。所以我看不出有什么区别。对于这两种情况,我不相信可以动态地增加/缩小分配,对吗?

int size = 0;
std::cout << "enter size: ";
std::cin >> size;

int* array_d = new int[size];   // "dynamic" allocation
int array_s[size];              // static allocation correct?

最佳答案

C++ 中有三种类型的内存分配。有静态分配:

int x[100];

void foo() {
    static int y[100];
}

这里,数组的大小在编译时就已知,并且每个进程都有一个数组实例,因此数组实际上可以由编译器静态分配:它们可以获得二进制文件中的固定位置和地址由此产生的过程的空间。

然后是自动分配:

void foo() {
    int z[100];
    // or even:
    //auto int z[100];
    // though nobody writes that
}

这大致介于静态和动态之间。大小必须在编译时已知,但每个函数调用都有一个实例。通常,实例分配在当前堆栈顶部附近。

最后,还有动态分配:

void foo(size_t n) {
    int *p = new int[n];
    delete[] p;
}

这里,数组的大小和在内存中的位置都是动态确定的,即在运行时确定的。

关于c++ - 'new' 在 C++ 中是如何动态的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17543522/

相关文章:

c++ - vector 迭代器 + 偏移量超出范围,在 while 循环结束时给出错误

c++ - 从 ubuntu 连接到 Oracle 数据库

python - numpy 数组末尾的索引

ios - ARC - popviewController/DismissViewController

c++ - irrlicht 模型加载/动画

arrays - 如何返回数组中第三大的数

javascript - 在 Javascript 中读取 PHP 返回的 JSON

swift - 为什么 self 不会在 block 中自动声明为无主?

iphone - 请帮助 : UINavigationController and view controllers memory management

c++ - 使用模板链接错误