none
为什么在构造函数中用\0给用new申请内存的数组表示结束后,在析构函数中就不用不了delete释放内存了 RRS feed

  • 问题

  • #include<iostream>
    #include<string>
    using namespace std;
    class String
    {
    private:
     char* str;
     int len;
    public:
     String();
     String(const char*s);
     ~String();
     void Show();
    };

    String::String()
    {
     str =NULL;
     len = 0;
    }

    String::String(const char*s)

     
     str = new char[strlen(s)+1];
     len = strlen(s);
     strcpy(str,s);
     str[len+1] = '\0';//这里我用\0表示结束
      
    }

    String::~String()

     delete [] str;//这里就不能用delete,因为上面的构造函数用str[len+1] = '\0'
    }

    void String::Show()
    {
     cout<<str<<"   "<<len<<endl;
     
    }


    int main()
    {
     String str1("shenyang");
     str1.Show();

     return 0;
    }

    2010年3月4日 10:34

答案

  • 1. strcpy得到的字符串,结尾已经带'\0'
     strcpy(str,s);

    2. 这句话导致数据操作越界。偏移是从0开始计算的。
     str[len+1] = '\0';//这里我用\0表示结束

    2. delete [] str;//这里就不能用delete,因为上面的构造函数用str[len+1] = '\0'
    没这一说。这句语句当然会被执行到。
    如果注解的想表达的是执行到这里会出错,那出错的原因是程序有BUG。而不是这个时间点不能用DELETE.
    2010年3月4日 11:58