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

C++ Document类单文档名参数转换构造函数实现咨询

问题1:该构造函数是否应当接收string对象并将其转换为char数组?

可以这么实现,有合理的使用场景:如果你的上层业务常用std::string类型传递文档名,这种写法能兼容上层调用逻辑。但建议参数改为const std::string&传常量引用,避免值传递带来的不必要的字符串拷贝开销。如果需要兼容C风格字符串的传入场景,也可以额外重载一个接收const char*参数的构造函数,两种实现可以共存。

问题2:当前实现是否正确?

你的实现存在多处错误和风险,问题如下:

  • 字段名不匹配:类定义中字符指针字段为subject、int字段为page,但你的代码中赋值用的是topic、pages,会直接编译失败
  • 字符串未补结束符:给subject、author分配1字节内存后没有写入'\0'结束符,后续对这两个指针执行字符串操作时会触发内存越界的未定义行为
  • 参数传递效率低:const string str是值传递,每次调用构造函数都会拷贝一次输入的string对象,性能损耗没必要
  • 内存安全隐患:你用new[]手动分配了堆内存,若没有配套实现delete[]释放内存的析构函数,以及符合三五法则的拷贝构造、拷贝赋值运算符,后续使用会大概率出现内存泄漏、重复释放、浅拷贝崩溃等问题
  • 无异常安全保证:如果某一次new[]分配内存失败抛出异常,之前已经分配的内存不会被自动回收,会产生资源泄漏

修正后的构造函数参考实现

Document::Document(const std::string& str) {
    // 处理name字段
    name = new char[str.length() + 1];
    strcpy(name, str.c_str());
    
    // 修正字段名,补充结束符初始化
    subject = new char[1];
    subject[0] = '\0';
    author = new char[1];
    author[0] = '\0';
    
    // 修正int字段名
    page = date = time = 0;
}

// 必须配套实现析构函数释放内存,示例如下:
Document::~Document() {
    delete[] name;
    delete[] subject;
    delete[] author;
}

内容的提问来源于stack exchange,提问作者Влад

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:36:03