在分配的数组之外添加项

Adding items outside of allocated array?

本文关键字:添加 数组 分配      更新时间:2023-10-16

我有一个类集:

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在边境驻扎警卫,他们开枪杀死任何看到的入侵者。

作为一名程序员,你的工作是让你的程序信守承诺。当流程违背承诺时,坏事可能会发生,也可能不会发生——对他们或其他流程。