【问题标题】:What happens on allocating with "new []" and deleting with just "delete"使用“new []”分配和仅使用“delete”删除会发生什么
【发布时间】:2023-03-03 06:56:24
【问题描述】:

好的,所以我正在用 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;
}

好像有些奇怪吧?别担心,删除是故意的,是这个问题的重点。现在我预计它会造成一些内存事故,因为这不是我们在堆上删除数组的方式,但是令我惊讶的是,它没有(我在调试和发布中都这样做了,并且同样的观察)

分配数组:

第一次修改:

二次修改

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

删除不正确

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

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

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

我的问题的要点是“new operator 在后台做了什么?”

【问题讨论】:

  • int main() { int* i = new int[4]; *i = 323; *(i + 1) = 453; std::cout
  • 我的机器崩溃了。由于未定义的行为,我看到的和你看到的都是合理的结果。在两者之间,我认为我的行为更好。
  • 好的,所以我在clang上测试了代码,它只是删除了数组中的第一个整数,其余的保持不变
  • 发生的事情是未定义
  • 我们的老朋友Undefined Behaviour任何东西都是允许的——程序就是无效的。

标签: c++ pointers malloc new-operator


【解决方案1】:

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

程序的行为未定义。

现在我预计它会造成一些记忆错误

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

我的意思是如果它是这样工作的

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

【讨论】:

  • 好的,所以我在 clang 上测试了它,它只是删除了数组中的第一个元素(应该如此),那么这个行为编译器是特定的吗?
  • (as it should) 当行为未定义时,程序“应该”没有行为。 So is this behavior compiler specific? 任何东西都会影响未定义的行为。这包括编译器、操作系统、CPU、月相和你的邻居。此外,即使在完全相同的条件下,行为也会有所不同。
  • @mitesh 它是未定义的,这意味着编译器可以为所欲为。行为可能会从一个编译器版本更改为另一个,它可以通过简单地使用不同的编译器标志来改变。对于使用相同标志但在不同架构/操作系统等上的相同编译器版本,它可能会发生变化。
  • @mitesh 直接回答您的问题,是的,它是特定于编译器的。它也可以是特定日期、特定天气,或者编译器甚至可以发出使用启动代码炸毁外国的代码。所有这些都不比另一个更有效或无效。这就是未定义的行为。
猜你喜欢
  • 1970-01-01
  • 2015-11-22
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多