问题
在使用c++ 指针的时候,经常会遇到如下情况
int *i = new int(1);
int *j = i;
delete i;
i = NULL;
if(j) {
//此处代码依然运行
std::cout << (*j) << std::endl;
}
多个指针指向同一个对象。当对象被删除时,如果有指针没有被赋值为null,将可能出现不可预期的后果。
解决
int *i = new int(1);
int **j = &i;
delete i;
i = NULL;
if(j) {
if(*j) {
std::cout << (**j) << std::endl;
}
}
根据c++ 编码规范 谁创建,谁删除
, 那么创建的时候,使用的指针是 i
,删除时也应该是用 i
去删除,其他需要使用该对象的地方,使用二级指针,保存 i
的地址,当i
被赋值为 null
时,通过二级指针判断i
是否有效。
注意
当i
的生命周期要小于 j
的时候,此方法不可用!!!