在Cow类构造函数传入const char*时程序崩溃,求排查原因
问题分析与解决
你的程序崩溃最可能的原因是缺少字符串操作函数的头文件,导致strcpy、strlen等函数未被正确声明,触发了未定义行为。
具体问题与修复步骤
1. 必须包含字符串操作头文件
在代码顶部添加:
#include <cstring>
C++中,strcpy、strlen等标准字符串函数的声明位于<cstring>头文件中。如果没有包含该头文件,编译器会对这些函数进行隐式声明(默认假设返回int且参数为int),这会导致函数调用时类型不匹配,最终引发崩溃。
2. 优化字符串复制的安全性
虽然你的长度判断逻辑看似合理,但strcpy本身不做边界检查,存在潜在的越界风险。建议改用strncpy确保目标数组不会溢出,同时增加空指针检查避免strlen崩溃:
Cow::Cow(const char* nm, const char* ho, double wt) { // 处理name的空指针与长度问题 if (nm == nullptr) { strcpy(name, "Unknown"); } else { // 最多复制19个字符,手动添加终止符确保字符串合法 strncpy(name, nm, 19); name[19] = '\0'; } // 处理hobby的空指针问题 if (ho == nullptr) { hobby = new char[8]; strcpy(hobby, "Unknown"); } else { hobby = new char[strlen(ho) + 1]; strcpy(hobby, ho); } weight = wt; }
3. 补充必要的类成员函数(可选但推荐)
你的类仅定义了带参数的构造函数,编译器不会生成默认构造函数,后续若需创建无参数Cow对象会编译失败。可以添加默认构造函数:
Cow() : weight(0.0) { strcpy(name, "Default"); hobby = new char[1]; hobby[0] = '\0'; }
同时,为避免浅拷贝导致的重复释放内存问题,建议显式定义复制构造函数和赋值运算符(遵循三/五法则):
// 复制构造函数 Cow(const Cow& other) { strcpy(name, other.name); hobby = new char[strlen(other.hobby) + 1]; strcpy(hobby, other.hobby); weight = other.weight; } // 赋值运算符 Cow& operator=(const Cow& other) { if (this != &other) { delete[] hobby; // 先释放当前内存 strcpy(name, other.name); hobby = new char[strlen(other.hobby) + 1]; strcpy(hobby, other.hobby); weight = other.weight; } return *this; }
内容的提问来源于stack exchange,提问作者Magnetr0n
相关产品推荐
相关产品推荐

