"这篇文档是《高质量C++/C编程指南》的一部分,主要讨论了C++编程中的指针参数在内存管理中的应用,特别是在函数调用时如何传递内存。"
在C++编程中,指针参数是传递内存地址的一种方式,它们在函数间传递数据时扮演着关键角色。然而,如果不正确地使用指针参数来申请或操作内存,可能会导致难以预料的问题。例如,标题中的问题“指针参数是如何传递内存的?”就涉及到一个常见陷阱。
在示例7-4-1中,`GetMemory`函数试图通过指针参数`p`为字符串分配内存,但这个操作并没有改变调用函数`Test`中的`str`指针。这是因为当`GetMemory`中的`p`被`malloc`分配内存后,这个分配仅在`GetMemory`的作用域内有效,而不会影响到`Test`中的`str`。在C++中,传递指针参数时,函数接收的是指针的副本,而不是指针本身。因此,对函数内部指针副本的修改不会影响到原始指针。
`GetMemory(char *p, int num)`函数内部的`p = (char *)malloc(sizeof(char) * num);`只会改变局部变量`p`的值,而不会影响到调用者`Test`中的`str`。所以,`Test`中的`str`仍然是`NULL`,尝试用它来复制字符串`"hello"`会导致运行错误。
理解这一点很重要,因为正确的做法是在调用函数外部预先分配内存,或者让函数返回指向新分配内存的指针。例如,可以改写`GetMemory`为返回分配的指针:
```cpp
char* GetMemory(int num) {
return (char*)malloc(sizeof(char) * num);
}
void Test() {
char *str = GetMemory(100);
if (str != NULL) {
strcpy(str, "hello");
} else {
// 处理内存分配失败的情况
}
}
```
这样,`GetMemory`函数返回了实际分配的内存,调用者`Test`可以直接使用返回的指针。
除了这个问题,文档还提到了其他内存管理的方面,如内存分配方式(包括`malloc`、`new`等)、常见的内存错误及对策、避免野指针、`free`与`delete`的使用,以及动态内存的释放等。这些内容对于编写高效、安全的C++代码至关重要。遵循良好的编程实践,如使用`const`关键字、理解和正确使用`new`和`delete`,以及在可能的情况下使用智能指针(如`std::unique_ptr`或`std::shared_ptr`),可以帮助开发者避免内存泄漏和悬挂指针等问题。