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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 04:22:26