使用 "new []" 分配并仅使用 "delete" 删除会发生什么
What happens on allocating with "new []" and deleting with just "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;
}
似乎有些奇怪吧?别担心,删除是故意的,这也是这个问题的重点。现在我预计它会发生一些内存事故,因为这不是我们在堆上删除数组的方式,但是令我惊讶的是,它没有(我在 Debug 和发布并有相同的观察)
正在分配数组:
第一次修改:
第二次修改
现在我预料到删除时会发生某种事故,因为我没有按照应该删除的方式删除它。但是
删除不正确
现在在另一个 运行 上我实际上使用了删除运算符 正确 并且它做了同样的事情:
现在,当我尝试使用 malloc 分配并使用 delete 释放它时,我得到了相同的结果。
所以我的问题是 - 为什么我的代码没有搞砸?我的意思是,如果这是它的工作原理,我可以只使用删除(指针)来擦除整个数组。
我的问题的要点是 “新运算符在幕后做了什么?”
What happens on allocating with “new []” and deleting with just “delete”
程序的行为未定义。
Now I expected it to do some memory mishaps
您的期望被误导了。未定义的行为并不能保证内存或其他方面的事故。程序的行为没有任何保证。
I mean if this is how it works
这就是您观察到它“起作用”的方式。这并不意味着它一定会一直这样工作。欢迎使用未定义的行为。
好的,所以我正在尝试使用 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;
}
似乎有些奇怪吧?别担心,删除是故意的,这也是这个问题的重点。现在我预计它会发生一些内存事故,因为这不是我们在堆上删除数组的方式,但是令我惊讶的是,它没有(我在 Debug 和发布并有相同的观察)
正在分配数组:
第一次修改:
第二次修改
现在我预料到删除时会发生某种事故,因为我没有按照应该删除的方式删除它。但是
删除不正确
现在在另一个 运行 上我实际上使用了删除运算符 正确 并且它做了同样的事情:
现在,当我尝试使用 malloc 分配并使用 delete 释放它时,我得到了相同的结果。
所以我的问题是 - 为什么我的代码没有搞砸?我的意思是,如果这是它的工作原理,我可以只使用删除(指针)来擦除整个数组。
我的问题的要点是 “新运算符在幕后做了什么?”
What happens on allocating with “new []” and deleting with just “delete”
程序的行为未定义。
Now I expected it to do some memory mishaps
您的期望被误导了。未定义的行为并不能保证内存或其他方面的事故。程序的行为没有任何保证。
I mean if this is how it works
这就是您观察到它“起作用”的方式。这并不意味着它一定会一直这样工作。欢迎使用未定义的行为。