Double delete of data doesn't crash

前端 未结 3 413
心在旅途
心在旅途 2021-01-19 23:57

I am trying to learn C++ and was writing programs to learn Copy Constructors and Operator overloading. I am surprised that the below program when Copy constructor is used do

3条回答
  •  灰色年华
    2021-01-20 00:26

    I wirte this piece of test code, hope it will help here, I think crush is related to platform a lot, it is not just by chance, since this piece of code crush in linux ,but works fine in codeblock IDE

    #include 
    #include 
    #include 
    using namespace std;
    
    class XHandler
    {
        public:
        XHandler()
        {
                data = new char[8];
                strcpy(data, "NoName");
                std::cout<< "default construcor is called" << std::endl;
        }
        XHandler (const char *str)
        {
                data = new char [strlen(str) + 1 ];
                strcpy (data, str);
                 std::cout<< "param construcor is called" << std::endl;
    
        }
        XHandler (const XHandler &xh)
        {
                data = xh.data;
                std::cout<< "copy construcor is called" << std::endl;
    
        }
        XHandler& operator = (const XHandler &xh)
        {
                data = xh.data;
                std::cout<< "operator construcor is called" << std::endl;
    
                return *this;
        }
        ~XHandler()
        {
            std::cout<< "destrucor is called" << std::endl;
            print_dir();
            if (data)
            {
                delete [] data;
                data = NULL;
                std::cout<< "delete data" << std::endl;
            }
    
    
    
        }
        void debug()
        {
                cout << data <

    it crush in linux gcc4.1.2 ,it outputs

    param construcor is called
    param construcor is called
    hello
    there
    location: 0x502010
    location: 0x502030
    copy construcor is called
    location: 0x502010
    hello
    default construcor is called
    operator construcor is called
    hello
    destrucor is called
    location: 0x502010
    delete data
    destrucor is called
    location: 0x502010
    *** glibc detected *** ./test: double free or corruption (fasttop): 0x0000000000502010 ***
    

提交回复
热议问题