在分配的数组之外添加项
Adding items outside of allocated array?
我有一个类集:
class Set
{
public:
//Default constructor
Set ();
//Some more functions...
private:
int *p;
const int K = 10;
int numval = 0; //Number of ints in the array
//Other variables...
};
默认构造函数:
Set::Set()
{
p = new int[K]; //Allocate memory for array with 10 ints
}
如果我在其他函数中用 10 个整数填充数组,然后添加另一个整数,会发生什么?编译器不会崩溃,我能够打印 11:th int。但是由于我没有为它分配内存,它存储在哪里?
例:
Set1 += 5;
将使用以下运算符重载向数组添加 5。
const Set& Set::operator+=(const int x)
{
p[numval] = x; //Add next int after the last int in the array
numval++; //Increment number of ints
return *this;
}
如果我在其他函数中用 10 个整数填充数组,然后添加另一个整数,会发生什么?
你会写入数组结束后的任何内存,导致未定义的行为:也许不会导致明显的问题,也许会损坏一些不相关的数据(或用于管理堆的元数据(,或者如果那里没有可写内存,可能会崩溃。
但是由于我没有为它分配内存,它存储在哪里?
它不存储在任何地方,从为其分配存储的意义上说。没有什么可以阻止您写入数组末尾以外的任意内存位置。小心不要那样做。
计算机内存是线性的。它是一大排单元格(字节(。每个单元格都有 2 个邻居(显然,第一个和最后一个除外(。分配记忆只是告诉"这部分是我的"的行为。这实际上只不过是一个承诺:你承诺不在你的情节之外写作,作为回报,你得到的承诺没有人会在里面写。那么,当你在分配的区域之外写作时会发生什么?你违背了你的诺言。你的旁边可能有别人的地块,可能有未使用的空间。当你在你的区域之外写作时,什么都不会发生。当合法主人回来并试图捡起他留下的东西时,真正的问题出现了——结果证明是别的东西,你放在那里的东西。(当然,你的情节有可能在系统认为重要的东西旁边。在这种情况下,OS在边境驻扎警卫,他们开枪杀死任何看到的入侵者。
作为一名程序员,你的工作是让你的程序信守承诺。当流程违背承诺时,坏事可能会发生,也可能不会发生——对他们或其他流程。
相关文章:
- 如何将元素添加到数组的线程安全函数?
- C++ 动态数组每次添加时将大小增加 1 - 错误
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 添加到数组指针
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- 将数组的元素添加到链表中
- 如何在C++中将元素添加到非固定大小的数组中?
- 将在堆栈上声明的元素添加到静态数组
- const_cast静态数组以添加恒常性
- 在 char* 数组中添加两个索引
- c++ 如何在数组的开头添加值并为其编制索引?
- 检查数组中是否有字符串中的值,如果没有,则添加它
- 添加数组特定列的元素
- 添加数组元素:需要左键作为赋值的左操作数
- 添加数组所有元素的 SSE 指令
- 如何添加数组的偶数和奇数之和
- 向std::multimap添加数组值
- 用内部类函数递归地添加数组数
- 使用自增操作符添加数组元素
- 创建一个模板函数,如果数据类型不同,则添加数组的元素