gpt4 book ai didi

c++ - 为什么删除不破坏任何东西?

转载 作者:IT老高 更新时间:2023-10-28 21:43:40 25 4
gpt4 key购买 nike

我正在玩一些内存动态分配,但我不明白。当使用 new 语句分配一些内存时,我应该能够使用 delete 销毁指针指向的内存。

但是当我尝试时,这个 delete 命令似乎不起作用,因为指针指向的空间似乎没有被清空。

让我们以这段真正基本的代码为例:

#include <iostream>  

using namespace std;

int main()
{
//I create a pointer-to-integer pTest, make it point to some new space,
// and fulfill this free space with a number;
int* pTest;
pTest = new int;
*(pTest) = 3;
cout << *(pTest) << endl;

// things are working well so far. Let's destroy this
// dynamically allocated space!
delete pTest;

//OK, now I guess the data pTest pointed to has been destroyed
cout << *(pTest) << endl; // Oh... Well, I was mistaking.

return 0;
}

有什么线索吗?

最佳答案

是时候了解什么是未定义行为了。 :)

在 C++ 中,当你做一些非法/无意义/坏/等等的事情时。该标准经常说“它会导致未定义的行为”。这意味着从那时起,您的程序状态将完全不受保证,任何事情都可能发生。

在您执行最后一个 *(pTest) 时,您会得到未定义的行为。这是因为 pTest 没有指向有效的对象,并且取消引用这样的指针是未定义的。所以你看到的是完全允许的:未定义的输出。

您所做的只是说“我已完成此分配”。一旦你这么说,你不应该(事实上,不能)再检查或关心那个内存。释放某些东西然后尝试使用它甚至在概念上都没有意义;你说你已经完成了!

您的输出在某种程度上是可以预测的:很可能,您的操作系统只是说“好的,感谢您的内存”,仅此而已。它没有理由真正“重置”内存,或做任何特别的事情。当没有人(包括您自己的程序)不使用它时,这确实是浪费时间。

但是请记住,这个输出是完全未定义的。不要尝试使用不存在的对象。也许更好的测试是:

#include <iostream>

struct foo
{
~foo()
{
std::cout << "foo is gone :(" << std::endl;
}
};

int main(void)
{
foo* f = new foo();
delete f; // you'll see that the object is destroyed.
}

虽然您似乎想看看内存本身会发生什么。请记住,摆脱内存然后尝试使用它是没有意义的,所以答案是:谁知道呢。这取决于您的特定平台,C++ 并不关心。

关于c++ - 为什么删除不破坏任何东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3280410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com