C++面试经典:内存管理与指针陷阱解析

需积分: 9 5 下载量 43 浏览量 更新于2024-07-23 1 收藏 1007KB PDF 举报
"C++面试中的常见难题涉及到内存管理、指针操作和动态内存分配等多个核心概念。" 在C++编程中,对内存的理解和正确管理是至关重要的,尤其是在面试和实际工作中。以下是对题目中涉及知识点的详细解释: 1. **动态内存分配与释放** - `(1)` 和 `(4)` 题目都涉及到`malloc()`和`free()`。在C++中,`malloc()`用于动态分配内存,而`free()`用于释放内存。如果在释放内存后继续使用该指针,将导致未定义的行为。在`(1)`中,`GetMemory`函数正确分配了内存并将其赋值给`str`,因此可以安全地使用`strcpy`和`printf`。而在`(4)`中,`GetMemory`尝试为`str`分配内存,但由于没有接收指针的地址,实际上没有修改`str`,因此`strcpy`尝试写入未分配的内存,导致程序崩溃。 2. **指针传递与引用** - `(1)` 中的`GetMemory`函数通过指针的指针(`char**`)来修改`str`的值,这是正确的方式,因为它允许函数改变外部变量的指向。而在`(4)`中,直接将`char*`作为参数传递,导致`GetMemory`内部的改变无法反映到外部。 3. **栈与堆内存** - `(3)` 题目讨论了栈内存与堆内存的区别。在函数中定义的数组`p`存储在栈上,当函数结束时,栈上的空间会被回收,返回这个指针是不安全的,因为其指向的内存可能已经被其他内容覆盖。在实践中,应使用`new`和`delete`操作符来处理堆内存,以确保其生命周期跨越函数边界。 4. **字符串与常量字符数组** - `(3)` 和 `(5)` 题目涉及到了字符串和常量字符数组。在C++中,字符串字面量如`"helloworld"`是存储在只读内存区域的,不能被修改。在`(5)`中,`GetMemory`返回一个指向字符串字面量的指针,虽然不会导致段错误,但试图修改它(如`strcpy(str, "world")`)是未定义行为。正确的做法是使用`const char*`类型声明并返回,或者在需要可变字符串时使用`new`分配内存。 5. **指针使用最佳实践** - 在释放指针后,为了避免意外使用已释放的内存,通常建议将指针设为`NULL`。在`(2)`中,虽然`str`在`free`后不再指向有效内存,但由于后续检查了`str!=NULL`,因此可以避免使用空指针。然而,这种做法并不推荐,更好的做法是在释放内存后立即设置指针为`NULL`。 理解这些基本概念对于编写健壮、无错误的C++代码至关重要,尤其是在面试场景中,这些问题经常用来测试候选人对内存管理、指针操作以及程序流程控制的理解程度。