- 申请的内存多次释放
- 内存泄漏:忘记delete 去释放内存
- 释放的内存不是申请时的内存 如图所示
int* p = new int[18]; p[0] = 0; for (int i = 0; i < 18; i++) { cout << *(p++) << endl; } delete[] p;
释放空指针
释放一个内存块,但继续引用其中的内容
越界访问,已经用了还没有清理,又继续被用,则会出现越界访问
项目实现
算法设计:
- 读取头文件并分配内存
- 从 数据文件读取地震数据,从键盘读取计算能量的短时间和长时间的窗口测量值的数目:
- 计算各个时间点上的短时间窗口和长时间窗口的能量值,打印出可能的地震时间,在这里,因为会涉及到频繁调用短时间和长时间窗口的能量值,我们可以将计算能量值设计为一个单独的函数
//地震监测系统主要是利用地震检波器收集到的地壳运动信息,从而预测和确定地震的震中以及强度 #include<iostream> #include<Windows.h> #include<string> #include<fstream> #include<cmath> using namespace std; const double THERDHOLD = 1.5; //计算短/长时间窗口能量数据的采样值 double power_w(double arr[], int length, int n); int main(void) { string filename; ifstream fin; int num = 0, short_window = 0, long_window = 0; double time_incr = 0, * sensor = NULL, short_power = 0,long_power=0,ratio=0; cout << "Enter name of input file" << endl; cin >> filename; fin.open(filename.c_str()); if (fin.fail()) { cerr << "error opening input file" << endl; exit(-1); } else { fin >> num >> time_incr; cout << "num: " << num << " time_incr: " << time_incr << endl; if (num >= 0) { sensor = new double[num]; for (int i = 0; i < num; i++) { fin >> sensor[i]; } cout << "Enter number of points for short_window" << endl; cin >> short_window; cout << "Enter number of points for long_window" << endl; cin >> long_window; //分析能量数据,找出地震事件 for (int i = long_window - 1; i < num; i++) { short_power = power_w(sensor, i, short_window); long_power = power_w(sensor, i, long_window); ratio = short_power / long_power; if (ratio > THERDHOLD) { cout << "Posiible even at" << time_incr * i << "seconds\n"; } } delete[] sensor; } fin.close(); } system("pause"); return 0; } double power_w(double arr[], int length, int n) { double xsquare = 0; for (int i = 0; i < n; i++) { xsquare += pow((length - i), 2); } return xsquare / n; }
内存泄漏检测工具
VisualC++debugger和CRT
第一步:包含以下头文件
#define_CRTDBG_MAP_ALLOC
#include<stdib.h>
#include<crtdbbg.h>
第二步:接管new 操作符
#ifdef_DEBUG
#ifndefDBG_NEW
#define DBG_NEW new(_NOEMAL_BLOK,_FILF__,__LINF__)