我对新操作员有两点疑虑
1。)
int a[20];
上面的语句在数组a中分配大小为20的内存
int a=new int[20];
这个陈述也做了同样的事情,为什么我应该使用新的运算符 什么时候通过数组分配大小很容易
2。)
为什么新的运算符总是用于将大小分配给指针变量
像
int *p;
p=new int[100];
它不用于为普通变量分配大小
答案 0 :(得分:1)
int a [20];
在堆栈上分配,大小必须在编译时知道。
int * a = new int [20];
在堆上分配,在编译时不需要知道大小,可以在运行时指定。
答案 1 :(得分:1)
int a[20];
在堆栈上分配内存。
int *a=new int[20];
在堆上分配内存。
堆栈优势: -
你可以控制那个记忆,即当你不需要那个记忆时你会选择哪个,因此与堆叠记忆相反,你会选择删除它。
堆栈堆栈的缺点: -
访问堆内存比访问堆栈内存慢一点,如果你错过了该内存上的删除而不是导致内存泄漏。
答案 2 :(得分:0)
new [20]创建“动态”内存(在堆上)。 [20]在堆栈上创建内存。
新的你可以做这样的事情:
std::vector<int*> my_std_vector;
for(int i=0; i < atoi(argv[1]); ++i) {
int *my_int = new int[20];
my_std_vector.push_back(my_int);
}
一些例子:http://www.cplusplus.com/reference/new/operator%20new%5B%5D/
答案 3 :(得分:0)
使用像这样的数组定义存在一些问题。
int a[20];
此语句在静态内存或堆栈中分配数组,具体取决于使用该语句的上下文。通常堆栈的大小有限。因此,对于在堆栈上定义的大型数组,程序可能会崩溃。
另一个问题是C ++中数组的大小应该是编译时常量表达式。如果应该在运行时确定数组的大小,那么如果正确写入,则必须使用示例中的new运算符:
size_t n = 20;
int *a = new int[n];
还有另一个问题。例如,您可能不会从函数返回数组,并且您可能不会返回指向本地数组的第一个元素的指针。因此,唯一的方法是返回指向动态分配的数组的指针或将数组包装在结构中。但最后一种方法对于大型阵列效率不高。
operator new可用于分配单个对象。例如
int *p = int( 10 );
当您需要分配类对象时,最常使用单个对象的新运算符。