You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于《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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:15:06