关于《C++ Primer Plus》示例clone函数指针未初始化与new调用的疑问
你贴出的这段示例代码存在印刷错误,和《C++ Primer Plus》原文要表达的逻辑并不匹配,也不存在自动调用new的机制:
原代码的问题
你对指针规则的理解是完全正确的:单独声明free_throws * ptr;只会为指针本身分配栈上的存储空间,不会为free_throws结构体分配任何内存,此时ptr是未初始化的野指针,后续*ptr = ft的解引用操作属于未定义行为,可能直接触发程序崩溃,也可能意外篡改其他内存数据。
和书籍描述匹配的正确代码
书中提到的“第一条语句创建无名free_throw结构体,指针ptr指向该结构体”的逻辑,对应的代码应该补全new调用:
const free_throws & clone(free_throw & ft) { free_throws * ptr = new free_throws; // 显式调用new分配堆内存 *ptr = ft; // 拷贝传入结构体的内容到新分配的内存 return *ptr; // 返回堆上结构体的引用 }
这段实现里new是显式调用的,只是因为最终返回的是结构体引用而非指针,调用者感知不到内存分配的动作,很容易忘记调用delete &jolly;释放对应内存,这就是书中提到的内存泄漏风险。
相关最佳实践
- 永远不要返回堆分配内存的引用,优先选择返回
std::unique_ptr<free_throws>智能指针,或者直接返回结构体值(C++17及以后标准的复制消去特性可以完全避免额外拷贝开销) - 所有指针必须在声明时完成初始化,禁止出现未初始化的野指针
- 若必须使用原始指针管理堆内存,必须在函数注释中明确告知调用者需要手动释放内存的责任
内容的提问来源于stack exchange,提问作者arka
相关产品推荐
相关产品推荐

