gpt4 book ai didi

"char *"和 "char * = new char[]"之间的 C++ 区别

转载 作者:行者123 更新时间:2023-11-30 02:02:07 25 4
gpt4 key购买 nike

所以,如果我想声明一个字符数组,我可以这样做

char a[2];
char * a ;
char * a = new char[2];

忽略第一个声明,其他两个使用指针。据我所知,第三个声明存储在堆中,并使用 delete operator 释放。第二个声明是否也将数组保存在堆中?这是否意味着如果某些东西存储在堆中且未被释放,则可以像具有文件链接的变量一样在文件中的任何位置使用?我在一个函数中尝试了第三个和第二个声明,然后在另一个函数中使用了变量,但它没有用,为什么?第二个和第三个声明之间还有其他区别吗?

最佳答案

  • 在第一种情况下,a[2] 在堆栈中存储了 2 个字符。
  • 在第二种情况下,根本没有分配 - a 是一个未初始化的指针。
  • 在第三种情况下,在堆上分配了 2 个字符。

你认为堆分配的变量可以在你的进程中共享是正确的,但是,你需要确保你传递分配的堆内存的位置 - 你这样做例如通过从您的方法或函数返回 a,或者通过增加 a 的范围,例如到类范围。

delete 将释放堆分配。在您的情况下,delete 只应在场景 3 中使用,因为在#1 中,堆栈变量在超出范围时被清理,而在#2 中,您没有分配任何内存。

由于上述情况很容易导致堆分配所有权转移过程中的困惑,因此 auto_ptrboost's shared_ptr 等智能指针可以用来让生活更简单。

关于 "char *"和 "char * = new char[]"之间的 C++ 区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13579572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com