C++第二三四周的new与delete
2017-07-11 本文已影响0人
SYSinsight
date: 2017-03-28 20:03:30
一.多维指针的new与delete
- 从第一维开始不断循环 自上而下地分配空间:
mat = new int*[row];
int i = 0;
for (; i < row; i++) {
mat[i] = new int[col];
}
另外,记得在初始化之后才能调用,避免使用野指针。
- 自下而上地删除空间
int i = 0;
for (; i < row; i++) {
delete[]mat[i];
}
delete[]mat;
mat = NULL;
值得注意的是,为防止野指针产生,在delete一片空间后要记得将其指向NULL
二.二叉树的节点删除中的野指针
if ((z->left == NULL) && (z->right == NULL)) {//z没有子树
if (z == root) {
delete root;
root = NULL;
}
else{
if (y->left != NULL && (y->left)->ele == num){
delete y->left;
y->left = NULL;
}
else{
delete y->right;
y->right = NULL;
}
}
}
上面的z指向要被删除的节点,为什么不直接delete z;z=null;? 因为这样就不方便找到y(z的父节点),进而y的左子树指针或右子树指针不能指向null,就会出现一个野指针。
三.memory check:leak_definitelyLost:
即内存泄露问题,一般为new完未delete,暂时见过:
- 多维指针的删除时删除不彻底
- 在判断条件前new,例如判断语句后可能直接return,就会忘记delete,要在每一个new时想仔细在哪里delete。