我有一个课程集:
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:int。但是因为我没有为它分配内存,它存储在哪里?
示例:
Set1 += 5;
使用以下运算符overloader为数组添加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;
}
答案 0 :(得分:3)
如果我在其他一些函数中用10个int填充数组然后添加另一个,会发生什么?
你写入数组结束后出现的任何内存,导致未定义的行为:可能没有造成明显的问题,可能会破坏一些不相关的数据(或用于管理堆的元数据),或者可能崩溃那里没有可写的记忆。
但是因为我没有为它分配内存,它存储在哪里?
在为其分配存储空间的意义上,它不存储在任何地方。没有什么可以阻止你写入超出数组末尾的任意内存位置。小心不要这样做。
答案 1 :(得分:1)
计算机内存是线性的。这是一大排单元格(字节)。每个单元格都有2个邻居(显然除了第一个和最后一个)。分配记忆只是告诉“这部分是我的”。它只不过是一个承诺:你保证不会在你的情节之外写作,作为回报,你会得到承诺,没有其他人会在其中写下来。那么当你在分配区域之外写字时会发生什么?你违背诺言。在你旁边可能有别人的情节,可能有未使用的空间。当你在自己的区域外写字时,什么都不会发生。当合法的所有者回来并试图拿起他留下的东西时,真正的问题就出现了 - 事实证明这是其他东西,你放在那里的东西。 (当然,你的情节可能与系统认为重要的东西相邻。在这种情况下,OS站点在边境守卫,他们开枪杀死任何闯入者。)
作为程序员,您的工作是让您的计划遵守承诺。当流程违背承诺时,可能会或可能不会发生坏事 - 对他们或其他流程。