我正在根据“C++”的官方教程学习C++的基础知识,并具有以前的Java经验。本教程将操作符“新”作为在运行时定义数组大小的一种方法;然而,这感觉是无用的添加,因为我可以通过以下操作轻松地用变量定义数组的大小
int numbers [size];与
int * numbers = new int [size];通过自己的测试,我已经意识到使用新的操作符可以检查预先分配的内存大小(当我用size =5初始化它时,我可以写到numbers7 ),而第一行代码不允许。关于这个接线员,我有三个基本问题:
发布于 2019-08-18 05:19:37
整数大小; 与 整数=新的整数大小;
第一个是在标准C++中,它要求在编译时知道并固定size的值。第二个允许在运行时(例如基于用户输入)确定size的值。
有些编译器允许将第一个表单与size作为变量一起使用,但这不是标准的C++。这种可变长度数组是C(从1999年起)的一个特性,一些C++编译器支持它作为一个非标准扩展。其他C++编译器将诊断错误(按照C++标准的要求)。
如何分配第一个取决于上下文。例如;
arr将具有自动存储持续时间,并且将在封闭块的末尾(例如,当函数返回时)停止存在。struct或class类型的成员,则每当创建该struct或class的实例时,都会创建该数组。上面的前两个在某种程度上是不正确的,有时说是在“堆栈”上创建的。但是,C++标准并不要求-“堆栈”是与操作系统和运行时环境相关联的实现细节。
第二种方法是动态分配内存(使用操作符new)。内存将一直存在,直到显式释放(例如,使用相应的操作符delete)。
将指针地址写入我开始时没有分配的数组中的指针地址是否危险?
是。C++标准没有定义这种行为。实际上,它似乎是正确的。它还可能产生不想要的效果,如程序使用的数据中毒或硬盘重新格式化。在令人讨厌的情况下,它似乎在您的测试中正确工作,但在付费客户端运行时只产生了一种不想要的效果。这种情况往往会给脾气暴躁的客户带来麻烦。
无论是使用指针还是数组,这种行为都是同样未定义的。用五个元素为数组的第十个元素赋值会给出未定义的行为,而不管数组是如何创建的(例如,在两个选项中的任何一个中)。
如果这样做是危险的,那么除了手动设置(或使用库)链接列表之外,我还能使用什么替代方法(如果有)来设置列表?
在C++中,有标准容器。查找vector (在标准标头<vector>中)作为示例。显然,不正确地使用标准容器是可能的(并且会产生不必要的影响),但是使用标准容器比使用数组或指针更容易避免问题。
标准容器还自动处理内存分配和取消分配--作为程序员,您不需要直接管理动态内存(例如,当不再需要时忘记释放内存)。
发布于 2019-08-18 04:56:34
上面这两行代码有什么区别?
假设size是一个常量表达式,区别是第一个示例在堆栈上分配,第二个示例在堆上分配,您需要记住要记住对它进行delete []。
将指针地址写入我开始时没有分配的数组中的指针地址是否危险?
编写外部边界是一种未定义的行为,但如果您在边界内,则可以:
constexpr int size = 5;
int arr[size];
arr[0] = 2;如果这样做是危险的,我还能用什么办法呢?
std::vector<int> arr;https://stackoverflow.com/questions/57541700
复制相似问题