添加分配数组之外的项目?

时间:2014-11-29 11:30:04

标签: c++ arrays

我有一个课程集:

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;
}

2 个答案:

答案 0 :(得分:3)

  

如果我在其他一些函数中用10个int填充数组然后添加另一个,会发生什么?

你写入数组结束后出现的任何内存,导致未定义的行为:可能没有造成明显的问题,可能会破坏一些不相关的数据(或用于管理堆的元数据),或者可能崩溃那里没有可写的记忆。

  

但是因为我没有为它分配内存,它存储在哪里?

在为其分配存储空间的意义上,它不存储在任何地方。没有什么可以阻止你写入超出数组末尾的任意内存位置。小心不要这样做。

答案 1 :(得分:1)

计算机内存是线性的。这是一大排单元格(字节)。每个单元格都有2个邻居(显然除了第一个和最后一个)。分配记忆只是告诉“这部分是我的”。它只不过是一个承诺:你保证不会在你的情节之外写作,作为回报,你会得到承诺,没有其他人会在其中写下来。那么当你在分配区域之外写字时会发生什么?你违背诺言。在你旁边可能有别人的情节,可能有未使用的空间。当你在自己的区域外写字时,什么都不会发生。当合法的所有者回来并试图拿起他留下的东西时,真正的问题就出现了 - 事实证明这是其他东西,你放在那里的东西。 (当然,你的情节可能与系统认为重要的东西相邻。在这种情况下,OS站点在边境守卫,他们开枪杀死任何闯入者。)

作为程序员,您的工作是让您的计划遵守承诺。当流程违背承诺时,可能会或可能不会发生坏事 - 对他们或其他流程。