首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用变量定义数组大小与使用新的操作符c++有什么区别?

使用变量定义数组大小与使用新的操作符c++有什么区别?
EN

Stack Overflow用户
提问于 2019-08-18 04:39:09
回答 2查看 302关注 0票数 0

我正在根据“C++”的官方教程学习C++的基础知识,并具有以前的Java经验。本教程将操作符“新”作为在运行时定义数组大小的一种方法;然而,这感觉是无用的添加,因为我可以通过以下操作轻松地用变量定义数组的大小

代码语言:javascript
复制
int numbers [size];

代码语言:javascript
复制
int * numbers = new int [size];

通过自己的测试,我已经意识到使用新的操作符可以检查预先分配的内存大小(当我用size =5初始化它时,我可以写到numbers7 ),而第一行代码不允许。关于这个接线员,我有三个基本问题:

  1. 上面这两行代码有什么区别?
  2. 将指针地址写入我开始时没有分配的数组中的指针地址是否危险?
  3. 如果这样做是危险的,那么除了手动设置(或使用库)链接列表之外,我还能使用什么替代方法(如果有)来设置列表?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-18 05:19:37

整数大小; 与 整数=新的整数大小;

第一个是在标准C++中,它要求在编译时知道并固定size的值。第二个允许在运行时(例如基于用户输入)确定size的值。

有些编译器允许将第一个表单与size作为变量一起使用,但这不是标准的C++。这种可变长度数组是C(从1999年起)的一个特性,一些C++编译器支持它作为一个非标准扩展。其他C++编译器将诊断错误(按照C++标准的要求)。

如何分配第一个取决于上下文。例如;

  • 如果在函数之外(例如,在文件范围内),它将被静态地分配,并且只要程序运行,它就会存在。
  • 如果在块内(例如在函数中),arr将具有自动存储持续时间,并且将在封闭块的末尾(例如,当函数返回时)停止存在。
  • 如果是structclass类型的成员,则每当创建该structclass的实例时,都会创建该数组。

上面的前两个在某种程度上是不正确的,有时说是在“堆栈”上创建的。但是,C++标准并不要求-“堆栈”是与操作系统和运行时环境相关联的实现细节。

第二种方法是动态分配内存(使用操作符new)。内存将一直存在,直到显式释放(例如,使用相应的操作符delete)。

将指针地址写入我开始时没有分配的数组中的指针地址是否危险?

是。C++标准没有定义这种行为。实际上,它似乎是正确的。它还可能产生不想要的效果,如程序使用的数据中毒或硬盘重新格式化。在令人讨厌的情况下,它似乎在您的测试中正确工作,但在付费客户端运行时只产生了一种不想要的效果。这种情况往往会给脾气暴躁的客户带来麻烦。

无论是使用指针还是数组,这种行为都是同样未定义的。用五个元素为数组的第十个元素赋值会给出未定义的行为,而不管数组是如何创建的(例如,在两个选项中的任何一个中)。

如果这样做是危险的,那么除了手动设置(或使用库)链接列表之外,我还能使用什么替代方法(如果有)来设置列表?

在C++中,有标准容器。查找vector (在标准标头<vector>中)作为示例。显然,不正确地使用标准容器是可能的(并且会产生不必要的影响),但是使用标准容器比使用数组或指针更容易避免问题。

标准容器还自动处理内存分配和取消分配--作为程序员,您不需要直接管理动态内存(例如,当不再需要时忘记释放内存)。

票数 3
EN

Stack Overflow用户

发布于 2019-08-18 04:56:34

上面这两行代码有什么区别?

假设size是一个常量表达式,区别是第一个示例在堆栈上分配,第二个示例在堆上分配,您需要记住要记住对它进行delete []

将指针地址写入我开始时没有分配的数组中的指针地址是否危险?

编写外部边界是一种未定义的行为,但如果您在边界内,则可以:

代码语言:javascript
复制
constexpr int size = 5;
int arr[size];
arr[0] = 2;

如果这样做是危险的,我还能用什么办法呢?

使用std::vector

代码语言:javascript
复制
std::vector<int> arr;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57541700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档