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

Stroustrup PPP习题17.4:自定义strdup函数运行内存释放报错咨询

你对问题的判断完全正确:不能对s执行delete[]的核心原因,就是s指向的内存不是通过new[]分配的,你没有释放它的权限。

具体原因可以拆解为以下几点:

  • 你调用strdup时传入的参数是&str[0],这个指针指向std::string对象内部管理的字符数组,这部分内存的分配、释放完全由std::string对象自己负责,不属于你在strdup函数中可以操作的范围,擅自释放会直接触发未定义行为。
  • C++内存管理的核心规则就是所有权匹配:只有你用new申请的内存才能用delete释放,用new[]申请的内存才能用delete[]释放,除此之外的任何指针(栈内存指针、其他对象管理的堆内存指针等)调用delete/delete[]都是非法操作,你遇到的pointer being freed was not allocated报错就是运行库检测到非法释放操作后的提示。
  • 回到习题本身的要求:strdup的功能仅为复制传入的C风格字符串到新分配的自由存储内存中,不需要对原字符串做任何修改、释放操作。你删除delete[] s之后的逻辑完全符合要求:strdup负责申请新内存存复制后的字符串,调用方用完后通过delete[] cstr释放对应的内存,不存在内存泄漏。

额外的优化建议:你调用strdup时传参可以改用str.c_str(),这个接口本身就返回const char*类型的C风格字符串指针,比取&str[0]的写法更规范,可读性也更好。

内容的提问来源于stack exchange,提问作者cnewbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:54:05