构造函数中的类错误

Posted

技术标签:

【中文标题】构造函数中的类错误【英文标题】:classes error at constructor 【发布时间】:2013-08-25 18:42:46 【问题描述】:
class name 
    char *s;
    int len;
public:
    name()             // Default constr.
        s=NULL;
        len =0;
    
    //**************************************************
     ~name()           //  Destruct.
         if (s!=NULL)
             delete [] s;
             s=NULL;
         
     
     //*************************************************
    name(const char * s1);      // Constr.
    char* getName();    //fcn get name
    int getLen() ;       // fcn get lenght 
    void setName(const char * s1); // fcn set name  
;
void name::setName(const char * s1)
    if (s!=NULL)
        delete [] s;
            s=NULL;
     
        len = strlen(s1)+1;
        s=new char [len];  // back***
        strcpy(s,s1);

name::name(const char * s1)
    if (s!=NULL)
        delete [] s;
            s=NULL;
     
        len = strlen(s1)+1;
        s=new char [len];  // back***
        strcpy(s,s1);

char* name::getName()
    return s ;

int name::getLen()
    return strlen(s)+1 ;

int main()

    char C[20];
    cout << "Please enter a name: ";
    cin >> C;
    name AAA(C);
    name BBB;
    BBB.setName(C);
    cout << "\nThe length of A(" << AAA.getName();
    cout << ") is: \a" << AAA.getLen() << endl << endl;
    cout << "\nThe length of B(" << BBB.getName();
    cout << ") is: \a" << BBB.getLen() << endl << endl;
    system("pause");
    return 0;

当我运行代码时,“BBB”类成功执行,但“AAA”给我运行时错误!!

错误:

test0.exe 中 0x651157aa (msvcr100d.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0xccccccc0。

【问题讨论】:

使用std::string。顺便说一句,delete[] NULL; 是无操作的。 【参考方案1】:

这里:

name::name(const char * s1)
    if (s!=NULL)

是坏事发生的地方。 s 尚未初始化,您正在将其与 NULL 进行比较。为什么您最初的印象是NULL?这是未定义的行为。放弃条件 - 这是构建对象的地方,所以就这样做 - 构建它。

强制性 C++ 建议 - 使用 std::string

【讨论】:

以上是关于构造函数中的类错误的主要内容,如果未能解决你的问题,请参考以下文章

处理类构造函数中的承诺错误[重复]

React - 类构造函数错误中的 Typescript 默认值

具有私有构造函数和析构函数的类对象的向量?

试图将类作为参数传递给不同的类构造函数,但出现“转换”错误

带有向量的类构造函数中的析构函数调用

仅在一个构造函数上的类成员初始化程序中的隐式常量转换 [-Werror=overflow] 溢出