没有new的动态数组(C ++)

时间:2014-08-24 17:15:24

标签: c++ arrays

我是C ++的新手,这是一个非常基本的问题。

在C ++中,只有两种方法可以创建动态数组(在书中读取,如果我错了,请纠正我)使用new运算符或{{1}进行内存分配函数取自C.

声明数组malloc()时,方括号int array[size] 必须[]

但是,在以下代码中,constsize变量。

unsigned int

编译g ++时不会抛出任何错误,而且程序运行完美。

问题1:这可能是另一种创建动态数组的方法吗?

问题2:代码是否正确?

问题3:如果#include<iostream> int main() { using namespace std; unsigned int size; cout<<"Enter size of the array : "; cin>>size; int array[size]; // Dynamically Allocating Memory cout<<"\nEnter the elements of the array\n"; // Reading Elements for (int i = 0; i < size; i++) { cout<<" :"; cin>>array[i]; } // Displaying Elements cout<<"\nThere are total "<<size<<" elements, as listed below."; for (int j = 0; j < size; j++) { cout<<endl<<array[j]; } return 0; } 只能包含[],为什么代码有效?

2 个答案:

答案 0 :(得分:4)

  1. 正确,你发现了a gcc extension。这在C中已经被允许很长一段时间了,但是直到C ++ 14才进入C ++标准。
  2. 是的,代码是正确的,假设你可以使用该语言的非可移植扩展。
  3. 标准兼容编译器的确如此。您可以通过提供gcc-std=c++98编译器标记告诉-std=c++11您不想使用扩展程序。
  4. 如果在C ++中需要动态大小的数组,更好的方法是使用std::vector<T>。它为您提供动态分配数组的灵活性,并负责管理为您分配的内存。

答案 1 :(得分:1)

  

在C ++中,只有两种方法可以创建动态数组(读入   如果我错了,请使用new来分配内存   operator或malloc()函数,取自C。

这取决于动态的含义。

从严格的技术角度来看,在对象生命周期的上下文中,动态表示具有动态存储持续时间的内容。存储持续时间是对象在创建后的生存时间。具有动态存储持续时间的对象将继续存在,直到明确销毁为止。 (请注意,通过使用智能指针(如std::unique_ptr

可能会对此显式破坏进行模糊处理。

然而,这似乎并不是你在这个问题中真正要求的。你似乎在问:

  

如果我想为对象创建容器,但我不知道有多大   该容器需要到运行时,newmalloc我的   唯一的选择?

问题的答案是。事实上,在现代C ++中,new使用malloc应该是最后的选择,使用N应该是最后的手段。

不要尝试创建vector元素的C样式数组,而是使用std::vector <int> myInts; for (int i = 0; i < 10; ++i) myInts.push_back (i); 代替:

delete

这有几个好处:

  1. 您不必vector任何
  2. 在创建vector之前,您不必知道将有多少元素放入vector - 只需继续添加元素,直到您完成
  3. operator[] 保证拥有可靠的存储空间,这意味着可以使用{{1}}访问元素,就像C风格的数组一样