使用“ new []”进行分配并仅使用“ delete”进行删除会发生什么

问题描述

好的,所以我正在尝试使用C ++进行指针操作,因为在将近一年半的休息之后,我又开始重新编写代码(School Stuff)。所以,如果这对您来说太幼稚,请饶恕我,我只是在生锈。

无论如何,我在VS 2019中一直使用指针,但是我发现有些东西开始困扰我。

这是我写的代码

#include <iostream>

int main() {
    int* i = new int[4];
    *i = 323;
    *(i + 1) = 453;
    std::cout << *i << std::endl;
    std::cout << *(i + 1) << std::endl;
    delete i;
}

似乎有些奇怪吧?别担心,删除是有意的,也是这个问题的重点。现在我希望它会造成一些内存灾难,因为这不是我们删除堆上数组的方法 BUT 令我惊讶的是,它没有(我在Debug和Release中都这样做了,相同的观察结果

分配数组:

第一次修改

enter image description here

第二次修改

enter image description here

现在,我希望在删除时遇到某种不幸,因为我没有按照应该删除的方式删除它。但是

删除不正确

enter image description here

现在,在另一次运行中,我实际上正确地使用了删除运算符 ,并且它执行了相同的操作:

enter image description here

现在,当我尝试使用malloc进行分配并使用delete释放它时,我得到了相同的结果。

所以我的问题是-为什么我的代码不会混乱?我的意思是,如果这是它的工作方式,我可以使用delete(指针)擦除整个数组。

我的问题的要旨是 “新操作员在幕后做什么?”

解决方法

使用“ new []”进行分配并仅使用“ delete”进行删除会发生什么情况

程序的行为是不确定的。

现在我希望它会引起一些内存灾难

您的期望被误导了。未定义的行为并不能保证在内存中发生意外或其他情况。不能保证程序的行为。

我的意思是这是怎么工作的

这就是您观察它“起作用”的方式。这并不意味着它一定会一直那样工作。欢迎来到不确定的行为。