从C-Style-Array释放内存
Release memory from C-Style-Array
我写了一段简短的代码来了解由原始指针创建的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 []
的工作不会覆盖内存,也不会阻止你的程序随后访问该内存。但是,您可能会(也可能不会)发现一系列其他操作(例如分配另一个数组)可能会突然改变您看到的结果。
相关文章:
- 包含矢量指针的结构的内存释放问题
- Valgrind 声称内存释放中的自由空间太多
- 当 C 和 C++ 中严格要求内存释放时
- C++ 中指针变量的内存释放
- 德克内存释放
- 临时对象 c++ 的内存释放
- C 全局对象变量内存释放
- C++矢量动态内存释放/删除
- 从 cv::Mat 初始化的 IplImage 的内存释放
- SWIG类型映射中的内存释放
- STL容器中的内存释放
- QWebView内存释放
- 内存释放 C++
- 大返回值(如字符串)的内存释放如何在C++中发生
- 重新分配之前的内存释放
- Linux C++ 中的内存释放
- VS2012编译器奇怪的内存释放问题
- 调试断言失败!错误的内存释放
- 负责 COM 互操作中的内存释放
- imread命令后OpenCV矩阵内存释放