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,提问作者Влад
相关产品推荐
相关产品推荐

