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

mit*_*esh 0 c++ malloc pointers new-operator

好的,所以我在 C++ 中尝试使用指针,因为我在将近一年半的休息(学校的东西)后又开始编码了。所以如果这对你来说很幼稚,请原谅我,我只是生锈了。

无论如何,我在 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;
}
Run Code Online (Sandbox Code Playgroud)

有些东西看起来很奇怪吧?别担心,删除是故意的,并且是这个问题的重点。现在我预计它会发生一些内存事故,因为这不是我们在堆上删除数组的方式,但令我惊讶的是,它没有(我在 Debug 和 Release 中都这样做了并且有相同的观察)

分配数组:

第一次修改: 在此处输入图片说明

第二次修改 在此处输入图片说明

现在我期待在删除时发生某种事故,因为我没有按照应该删除的方式删除它。但

删除不正确

在此处输入图片说明

现在在另一次运行中,我实际上正确地使用了删除运算符,它做了同样的事情:

在此处输入图片说明

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

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

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

eer*_*ika 6

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

程序的行为是未定义的。

现在我预计它会做一些记忆事故

你的期望被误导了。未定义的行为不保证内存或其他方面的事故。程序的行为没有任何保证。

我的意思是如果这是它的工作原理

这就是你观察它“工作”的方式。这并不意味着它一定会一直这样工作。欢迎使用未定义的行为。

  • `(应该)` 当行为未定义时,程序“应该”没有任何行为。“那么这个行为是编译器特有的吗?”任何事情都可能影响未定义的行为。这包括编译器、操作系统、CPU、月相和你的邻居。此外,即使在完全相同的条件下,行为也可能不同。 (3认同)
  • @mitesh它是未定义的,这意味着编译器可以做任何他们想做的事情。该行为可能会从一个编译器版本更改为另一个编译器版本,它可能会通过简单地使用不同的编译器标志来更改。对于使用相同标志但在不同架构/操作系统等上的相同编译器版本,它可能会发生变化。 (2认同)