C++类中char*成员变量赋值后为空的问题求助
解决C++类中char*成员复制后为空的问题
嘿,刚接触C++类就碰到这种指针坑太正常了,我来帮你拆解问题~
你遇到的核心问题是:char*类型的成员变量没有提前分配足够的内存空间,直接用strcpy()复制字符串时,因为目标指针指向的是无效内存(要么是未初始化的野指针,要么是你显式设为nullptr的空指针),导致复制操作根本无法完成,最终打印时自然是空白。
先模拟你可能的错误代码
假设你的RentalCar.h是这样的:
#ifndef RENTALCAR_H #define RENTALCAR_H class RentalCar { private: char* m_make; char* m_model; public: RentalCar(const char* make, const char* model); ~RentalCar(); void printInfo() const; }; #endif
而RentalCar.cpp的错误实现大概是:
#include "RentalCar.h" #include <cstring> #include <iostream> RentalCar::RentalCar(const char* make, const char* model) { // 错误:m_make和m_model是空指针,没有分配内存就直接复制 strcpy(m_make, make); strcpy(m_model, model); } RentalCar::~RentalCar() { delete[] m_make; delete[] m_model; } void RentalCar::printInfo() const { std::cout << "Make: " << m_make << ", Model: " << m_model << std::endl; }
这种写法里,m_make和m_model默认是未初始化的(如果没显式初始化就是野指针,显式设为nullptr就是空指针),strcpy()需要目标指针指向一块能容纳整个源字符串(包括末尾的\0结束符)的有效内存,空指针显然不满足这个条件,所以复制完全没生效。
正确的解决方法
方法1:手动分配内存后用strcpy()
先为m_make和m_model分配足够的内存,再执行复制:
#include "RentalCar.h" #include <cstring> #include <iostream> RentalCar::RentalCar(const char* make, const char* model) { // 处理make参数:先判断是否为空,避免strlen出错 if (make != nullptr) { // 分配内存:字符串长度 + 1(存结束符\0) m_make = new char[strlen(make) + 1]; strcpy(m_make, make); } else { // 空输入时分配一个字节存空字符串 m_make = new char[1]; m_make[0] = '\0'; } // 同理处理model参数 if (model != nullptr) { m_model = new char[strlen(model) + 1]; strcpy(m_model, model); } else { m_model = new char[1]; m_model[0] = '\0'; } } RentalCar::~RentalCar() { // 记得释放手动分配的内存,避免内存泄漏 delete[] m_make; delete[] m_model; } void RentalCar::printInfo() const { std::cout << "Make: " << m_make << ", Model: " << m_model << std::endl; }
方法2:用strdup()简化操作(注意兼容性)
strdup()是POSIX标准函数(大部分编译器支持),它会自动分配内存并复制字符串:
#include "RentalCar.h" #include <cstring> #include <iostream> RentalCar::RentalCar(const char* make, const char* model) { // 三目运算符处理空输入,默认复制空字符串 m_make = make ? strdup(make) : strdup(""); m_model = model ? strdup(model) : strdup(""); } RentalCar::~RentalCar() { // strdup分配的内存要用free()释放,不能用delete free(m_make); free(m_model); } void RentalCar::printInfo() const { std::cout << "Make: " << m_make << ", Model: " << m_model << std::endl; }
方法3:推荐新手用std::string代替char*
如果你不是必须用char*,强烈建议用C++标准库的std::string,它会自动管理内存,完全不用操心分配、释放和复制的问题:
修改RentalCar.h:
#ifndef RENTALCAR_H #define RENTALCAR_H #include <string> class RentalCar { private: std::string m_make; std::string m_model; public: RentalCar(const std::string& make, const std::string& model); void printInfo() const; }; #endif
修改RentalCar.cpp:
#include "RentalCar.h" #include <iostream> // 用初始化列表直接完成赋值,简洁又高效 RentalCar::RentalCar(const std::string& make, const std::string& model) : m_make(make), m_model(model) { } void RentalCar::printInfo() const { std::cout << "Make: " << m_make << ", Model: " << m_model << std::endl; }
总结
对于刚接触C++的新手来说,std::string是比char*友好得多的选择,能避开很多内存管理的坑。如果一定要用char*,记住复制字符串前必须确保目标指针指向足够大的有效内存,否则strcpy()这类函数根本无法正常工作。
内容的提问来源于stack exchange,提问作者Ben Nordin
相关产品推荐
相关产品推荐

