"char *"和"char * = new char[]"之间的C++区别
C++ difference between "char *" and "char * = new char[]"
所以,如果我想声明一个字符数组,我可以这样做
char a[2];
char * a ;
char * a = new char[2];
忽略第一个声明,其他两个使用指针。据我所知,第三个声明存储在堆中,并使用删除运算符释放。第二个声明是否也保存堆中的数组?这是否意味着如果某些东西存储在堆中并且没有释放,则可以在文件中的任何位置使用,例如具有文件链接的变量?我在一个函数中尝试了第三个和第二个声明,然后在另一个函数中使用了该变量,但它不起作用,为什么?第二次和第三次声明之间还有其他区别吗?
- 在第一种情况下,
a[2]
在堆栈上存储 2 个字符。 - 在第二种情况下,根本没有分配 -
a
是未初始化的指针。 - 在第三种情况下,在堆上分配 2 个字符。
变量可以在整个进程中共享是正确的,但是,您需要确保传递分配的堆内存的位置 - 例如,通过从方法或函数返回a
,或通过增加a
的范围(例如类范围)来执行此操作。
delete
将释放堆分配。在您的情况下,delete
只应在方案 3 中使用,因为在 #1 中,堆栈变量在超出范围时会被清理,而在 #2 中,您尚未分配任何内存。
由于上述情况很容易导致堆分配所有权转移过程中的混乱,因此可以使用诸如auto_ptr
或boost shared_ptr之类的智能指针来使生活更简单。
相关文章:
- 在 C++ 中,字符串 a= "hello" 和字符串 a=(char *) "hello"有什么区别?
- 在 c++ 中,char *p 和 const char * p 有什么区别?
- for(char&c : s) 和 for(char c : s)之间的区别?
- 当返回一系列字符或指针到char文字时的区别
- char*const和constchar*之间有什么区别?(重复-需要更多澄清)
- "char *"和"char * = new char[]"之间的C++区别
- 忽略内存消耗,使用“int”或“char”是否有区别
- char阵列[]和char *数组之间有什么区别
- 使用char*argv[]而不是char*argv[]有很大的原因/区别吗
- (char*)和char*之间有什么区别
- C++ 中 int* 和 char* 之间的区别
- 定义 char 和 int 时指针有什么区别
- 函数int get()和istream&get(char&c)有什么区别
- C ++中的两个'char*'铸件有什么区别
- C++ 中的 'char()' 和 'char' 有什么区别
- typedef char[4] A 和 typedef char (&A)[4] 有什么区别?
- 在 C++ 中存储字符串时,char* 和 char 有什么区别?
- char *和string的区别
- 我不能理解const char*和char*之间的区别
- char*和char arr[]的区别- c++ /C