c++;使用“动态内存分配”;新"; 我是C++新手,想自己学习(我有java背景)。

c++;使用“动态内存分配”;新"; 我是C++新手,想自己学习(我有java背景)。,c++,memory-management,C++,Memory Management,有一种动态内存分配的概念,我可以使用new将其分配给数组(例如) 在C语言中(以及在C++中),我有malloc和realloc这样做。在C++中,他们添加了新< /代码>,不知什么原因。p> 我读过很多关于普通数组进入堆栈与动态分配数组进入堆之间的区别的书 所以我的理解是,通过使用new我在堆中分配空间,比如说,当完成一个函数时,这些空间不会被自动删除,但会一直保持不变,直到我最终手动释放它 我找不到在普通内存上使用动态内存分配的实际例子 据说当使用普通数组时,我不能通过运行时分配内存。嗯,可

有一种动态内存分配的概念,我可以使用
new
将其分配给数组(例如)

在C语言中(以及在C++中),我有
malloc
realloc
这样做。在C++中,他们添加了<代码>新< /代码>,不知什么原因。p> 我读过很多关于普通数组进入堆栈与动态分配数组进入堆之间的区别的书

所以我的理解是,通过使用
new
我在堆中分配空间,比如说,当完成一个函数时,这些空间不会被自动删除,但会一直保持不变,直到我最终手动释放它

我找不到在普通内存上使用动态内存分配的实际例子

  • 据说当使用普通数组时,我不能通过运行时分配内存。嗯,可能我没有正确理解它,因为当我尝试创建一个普通数组(没有
    new
    )时,它的容量由用户输入(比如
    arr[input]
    ),效果很好 我的意思是:

    int whatever;
    cin>>whatever;
    
    int arr2[whatever];
    
    for (int i = 0; i < whatever; i++) {
        arr2[i]=whatever;
        cout<<arr2[i];
    
    }
    
    int;
    不管怎样;
    int arr2[任何];
    for(int i=0;icout对于静态分配,必须将大小指定为常量:

      MyObj  arrObject[5];
    
    对于动态分配,可以在运行时更改:

      MyObj  *arrObject = new MyObj[n];
    

    new
    malloc
    之间的不同之处在于
    new
    将为数组中的所有对象调用ctor,而
    malloc
    只为您提供原始内存。

    当您在编译时知道数组的大小时,您可以这样声明它,它将存在于堆栈中:

    int arr[42];
    
    但是,如果您在编译时不知道大小,只知道在运行时,那么您不能说:

    int len = get_len();
    int arr[len];
    
    在这种情况下,您必须在运行时分配数组。在这种情况下,数组将位于堆上

    int len = get_len();
    int* arr = new int[len];
    
    当您不再需要该内存时,需要执行
    delete[]arr

    std::vector
    是一个可变大小的容器,允许您在运行时分配和重新分配内存,而无需担心显式分配和释放内存

    int len = get_len();
    std::vector<int> v(len); // v has len elements
    v.resize(len + 10); // add 10 more elements to the vector
    
    int len=get_len();
    向量v(len);//v有len元素
    v、 调整大小(len+10);//向向量中再添加10个元素
    
    如果你想使用一个数组,但在编译时你不知道确切的大小,这时动态内存分配就开始了。请参见下面的示例

    int a[3] = {1,2,3};  //<= valid in terms of syntax;
    
    另外,在释放它时,请调用
    delete[]ArrayPtr;
    ,而不是单独调用
    delete
    ,因为我们现在谈论的是释放内存块

    在C++中(也在C++中),我有Maloc和ReLoC这样做。在C++中,他们添加了“新的”,因为一些原因我不能理解。 malloc和realloc采用要分配的字节数,而不是要分配的类型,并且也不调用任何构造函数(同样,它们只知道要分配的大小)。这在C中很好用(因为它实际上具有比类型系统更多的大小系统),但对于C++更复杂的类型系统来说,它还不够。相反,new是类型安全的(不像malloc那样返回void*),并且在返回之前构造为您分配的对象

    据说在使用普通数组时,我无法通过运行时分配内存。可能我没有正确理解它,因为当我尝试创建一个普通数组(没有“新”)时,它的容量由用户输入(如arr[input])。它工作得很好

    这是编译器扩展(C99的一部分),它不是标准C++。标准要求“正常”数组有一个在编译时已知的绑定。但是,看来编译器决定支持可变长度的“正常”数组。 我真的不明白为什么它被称为动态,而扩展阵列容量的唯一方法是将其复制到一个新的、更大的阵列


    <>它的动态性是,直到运行时你才知道大小(因此可以在不同的调用中不同)。编译时间与运行时间是一个你在其他语言中经常无法区分的区别(至少在我的经验中),但是当我试图创建一个正常数组(没有“新”)时,理解C++(

    <代码>)是至关重要的。使用用户输入的容量(如arr[input])。效果很好。
    听起来不对。@Jashaszun GCC VLAs是我的猜测。这可能会有帮助。.小点-新建(和删除)的原因是分配并调用构造函数(或调用析构函数并释放),我举了你的例子并尝试了一下。它帮助我理解。谢谢!
    int size = 3;
    int a[size] = {1,2,3} //<= compile error
    
    int* ArrayPtr = new int[size];