gpt4 book ai didi

c++ - 从 C-Style-Array 释放内存

转载 作者:太空狗 更新时间:2023-10-29 20:54:26 26 4
gpt4 key购买 nike

我写了一段简短的代码来了解由原始指针创建的 C 风格数组。我知道今天使用这种方法很不寻常,但我只是想尝试一下。所以这是我的代码:

#include <iostream>

int main() {
int *ptr = new int[5];
for(unsigned int counter = 0; counter < 5; counter++) {
ptr[counter] = counter * counter;
std::cout << ptr[counter] << std::endl;
}

delete [] ptr;

std::cout << ptr[2] << std::endl; // Contains still a value
}

输出:

0
1
4
9
16
4

这是一个非常简单的代码,我刚刚创建了一个包含五个“int”字符的内存字段,并用一些数字填充它们。我在使用后删除了数组指针构造以避免内存泄漏,但令我惊讶的是包含第三个到第五个位置的仍然值,第一个和第二个指针被正确删除。有人对这种现象有答案吗?

最佳答案

一旦语句 delete [] ptr 完成,几乎所有 ptr 的使用(除了重新分配它指向某物)都会产生未定义的行为。

在 C++ 标准中,“未定义”的意思是该标准没有对发生的事情指定任何约束或要求。因此,通过一种实现(编译器和库),它可能会给出您看到的结果。与另一个它可以异常终止程序。对于另一种实现,每次运行程序时观察到的行为都可能不同。所有这些可能性以及其他可能性都是正确的,因为该标准未描述任何要求。

在您的特定情况下,它仅意味着您的实现提供的 operator delete [] 的工作不会覆盖内存,并且不会阻止您的程序随后访问该内存。但是,您可能(或可能不会)发现一系列其他操作(例如分配另一个数组)可能会突然改变您看到的结果。

关于c++ - 从 C-Style-Array 释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39188844/

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