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
相关产品推荐
相关产品推荐

