使用int someInts[3]
声明一个新的整数数组与使用int* someInts = new int[3]
声明一个新的整数数组有什么区别?int someInts [3]和int * someInts = new int [3]之间的区别?
回答
有2间主要的差异:
第一个将分配堆栈上的存储器,那将是一次函数返回不可用。
第二个将在freestore上分配一个内存,这个内存将一直存在,直到被删除。第一个
someInts
是一个整数的数组,你不能指定新的地址给它。
第二个是int指针,所以你可以给它分配一个新的地址。
声明int* someInts = new int[3]
在堆上分配内存。声明int someInts[3]
将它分配到堆栈上。
这种差异通常很重要(尤其是当您处理的不是int
s时),当您使用后者(int *someints = new int[3];
)时,必须在完成使用后明确删除数据。
大多数情况下,您想用std::vector<int> someints(3);
代替。为数据,这将(通常)分配的空间同样,但当变量超出范围(包括,例如,它会自动删除空间,留下通过一个异常范围被抛出,这是更为困难在手动分配/释放内存时正确处理)。
+1:第一个答案,管理解释的差异没有提到实现特定的细节(堆栈与堆)。 – 2012-02-21 01:17:40
当你someInts [3],你在栈上分配内存,这意味着它会删除自己(好),但如果你要访问的功能已经结束,你会遇到麻烦之后,因为它已经将已被删除。 IE:
int* returnPointerThingy(){
int someInts[3];
someInts[0] = 3;
someInts[1] = 2;
someInts[2] = 1;
return someInts
}
这将返回一个空指针,因为someInts已被删除。如果你尝试访问someInts上帝帮助你。
如果这与您想要使用new
关键字的操作类似。它将允许你在“堆”上分配一些东西,并且它会在它声明的函数结束后继续存在。因此:
int* returnPointerThingy(){
int* someInts = new int[3];
someInts[0] = 3;
someInts[1] = 2;
someInts[2] = 1;
return someInts
}
不会返回空指针,您将能够使用someInts存储的值。然而,这带有一个缺点,你必须删除someInts这样的:
delete [] someInts
所以你不要有内存泄漏最终,当堆被采取了由指针和这样的。
这要看您的具体情况为,其使用的都是在自己的情况更好。
- 1. int * a [3]和int(* a)[3]之间的区别?
- 2. “int * a = new int”和“int * a = new int()”有什么区别?
- 3. 新的int和new(int)之间的C++有什么区别?
- 4. int * x []和int(* x)[]之间的区别?
- 5. int p = *(int *)i和int p = *(int *)&i之间的区别
- 6. Arraylist <Interger> vs int [] list = new int [3];
- 7. make([] int,0),[] int {}和* new([] int)有什么区别?
- 8. Java中的int a [5],int a [],int a [] = {2,3}之间的区别
- 9. Python 3中int()和floor()之间的区别是什么?
- 10. C++中新int()和新int {}之间的区别
- 11. '(int)a','a as int'和C#中的Convert.ToInt32(a)之间的区别
- 12. C#中char和int之间的区别#
- 13. int,NSInteger和NSUInteger之间的区别
- 14. uint和unsigned int之间的区别?
- 15. Python 3.5 - '//'和'int()'之间的区别
- 16. int和Integer之间的区别
- 17. Int和Uint8之间的区别swift
- 18. void main和int之间的区别主
- 19. defaultdict(lambda:None)和defaultdict(int)之间的区别
- 20. foo(int * arr)和foo(int arr [])之间的任何区别?
- 21. int * p和int * p声明之间的区别
- 22. 传递(int x)和(const int x)之间的区别
- 23. static_cast <int>(var)和*(int *)&var之间的区别是什么?
- 24. int fpurge()和int fflush()之间的区别C
- 25. int和signed int声明之间的区别
- 26. int main()和int main(void)之间的区别?
- 27. (int *)arr [2]和int * arr [2]之间的区别是什么?
- 28. const int&x = 4和const int x = 4之间的区别
- 29. “Convert.ToString(Nullable <int>)”和“Nullable <int> .ToString()”之间的区别?
- 30. 最终静态int和静态最终int之间的区别?
根据您的角度来看,它可能没有帮助“栈”和“堆”来区分,因为这些都不是概念C++语言本身涉及的。 – 2012-02-21 01:16:59
@OliCharlesworth - 感谢您的评论。你会用什么词来指出我提到的第一个区别? – MByD 2012-02-21 01:19:53
@OliCharlesworth相反,RAII习惯用法是C++设计的一大问题。并且说,freestore不是RII中的R是不灵活的。 – 2012-02-21 01:20:34