【发布时间】: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