您的位置:首页 > 汽车 > 新车 > C++学习之避免使用野指针

C++学习之避免使用野指针

2024/10/19 23:40:26 来源:https://blog.csdn.net/qawsedrf123lala/article/details/139373129  浏览:    关键词:C++学习之避免使用野指针

现有结构体struct_a和struct_b,其中struct_b中包含struct_a指针作为成员变量。先基于struct_a定义一个变量a_ptr,之后定义一个struct_b指针变量b_ptr,并将a_ptr赋值给b_ptr中的struct_a类型变量。之后释放b_ptr, 那么a_ptr指向的内存是否还可以访问?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>struct struct_a{int id;char* name;
};
typedef struct struct_a struct_a_t;struct struct_b{int id;char* name;struct_a_t *struct_a;
};
typedef struct struct_b struct_b_t;int main(){struct_a_t* struct_a = (struct_a_t*)malloc(sizeof(struct_a_t));if (struct_a == NULL) {fprintf(stderr, "Memory allocation failed for struct_a\n");return EXIT_FAILURE;}struct_a->id = 10;struct_a->name = strdup("1000");if (struct_a->name == NULL) {fprintf(stderr, "Memory allocation failed for struct_a->ptr\n");free(struct_a);return EXIT_FAILURE;}struct_b_t* struct_b = (struct_b_t*)malloc(sizeof(struct_b_t));if (struct_b == NULL) {fprintf(stderr, "Memory allocation failed for struct_b\n");free(struct_a->name);free(struct_a);return EXIT_FAILURE;}struct_b->id = 10;struct_b->name = strdup("cadda");if (struct_b->name == NULL) {fprintf(stderr, "Memory allocation failed for struct_b->name\n");free(struct_a->name);free(struct_a);free(struct_b);return EXIT_FAILURE;}struct_b->struct_a = struct_a;printf("address of struct_a: %p\n", struct_a);// 将struct_a的指针保存,以便在释放struct_b后继续使用struct_a_t* saved_struct_a = struct_b->struct_a;// 释放struct_b及其内部的name,但保留对struct_a的引用free(struct_b->name);free(struct_b);struct_b = NULL;// 现在可以安全地使用saved_struct_aprintf("address of saved_struct_a: %p\n", saved_struct_a);// 使用完毕后,释放saved_struct_a及其内部的ptrfree(saved_struct_a->name);free(saved_struct_a);return 0;
}

如果没有使用saved_struct_a来保存struct_a的指针,而是直接释放了struct_b,struct_b的一个成员是指向struct_a的指针。当执行以下代码释放struct_b:

free(struct_b->name);
free(struct_b);
struct_b = NULL;

这确实会释放struct_b所占用的内存,但并不会直接触及到struct_a,因为动态分配的struct_a是独立的。然而,如果没有将struct_a的指针保存到其他地方(比如saved_struct_a),那么一旦struct_b被释放,你就失去了访问struct_a的途径。虽然struct_a的内存没有被直接释放,但它变成了悬空指针——一个仍然存在但没有有效途径访问的内存块。在这种情况下,如果不对struct_a进行额外的保存或管理,它实质上变得不可用,尽管没有立刻造成访问违规,但长期来看容易导致内存泄漏,因为你无法再释放这块内存。

所以,简单来说,不使用saved_struct_a来保存struct_a的指针,在释放struct_b之后,并不会使struct_a立即失效或无法访问(因为它的内存还未被释放),但确实会导致你失去对这块已分配内存的控制,增加内存泄漏的风险,并且在实践中很难安全地再次访问或释放这块内存。因此,保留对所有动态分配内存的有效引用是非常重要的。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com