所以,如果我想声明一个字符数组,我可以这样做
char a[2];
char * a ;
char * a = new char[2];
忽略第一个声明,另外两个使用指针。据我所知,第三个声明存储在堆中,并使用delete运算符释放。第二个声明是否也将数组保存在堆中?这是否意味着如果某些内容存储在堆中并且未释放可以在文件中的任何位置使用,例如具有文件链接的变量?我在一个函数中尝试了第三个和第二个声明,然后在另一个函数中使用该变量,但它不起作用,为什么?第二次和第三次声明之间是否还有其他差异?
答案 0 :(得分:4)
a[2]
在堆栈上存储2个字符。 a
是未初始化的
指针。 你认为堆分配的变量可以在你的进程中共享是正确的,但是,你需要确保你传递分配的堆内存的位置 - 你这样做,例如从您的方法或函数返回a
,或者通过增加a
的范围,例如到课堂范围。
delete
将释放堆分配。在您的情况下,delete
应仅用于场景3,因为在#1中,堆栈变量在超出范围时被清除,而在#2中,您没有分配任何内存。
由于在堆分配的所有权转移过程中上述情况很容易导致混乱,因此可以使用auto_ptr
或boost's shared_ptr等智能指针来简化生活。