lnlidawei

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

[cpp]:  c_string 类的实现(bug)

 

 

 

 

一、说明

 

  1、当每个【c_string对象】到达自身的生命周期时,这个【c_string对象】为什么不调用自身的析构函数【 ~c_string() 】 ?

 

 

 

 

二、源程序

  1 #include  <iostream>
  2 #include  <string>
  3 
  4 using namespace std;
  5 
  6 #define ENDSTRING '\0'
  7 
  8 //  c_string::begin
  9 class c_string
 10 {
 11 private:
 12 int mv_size =  0 ;
 13 char *mv_string = nullptr ;
 14 static int sv_objcounter ;        //  count objects of class c_string
 15 
 16 public:
 17 c_string()
 18 {
 19     mv_size = 0 ;
 20     mv_string = nullptr  ;
 21     (c_string::sv_objcounter)++ ;
 22 }
 23 
 24 c_string( const char *s )
 25 {
 26     (c_string::sv_objcounter)++ ;
 27     
 28     for ( int i = 0 ;  s[i] != '\0' ;  i++ )
 29     {
 30         ++(mv_size) ;
 31     }
 32 
 33     const int CSIZE = mv_size + 1 ;
 34     mv_string  =  new char[CSIZE] ;
 35     if ( mv_string == nullptr )
 36     {
 37         cout << "[error]#\t Lack Memory. " << endl ;
 38         exit (1) ;
 39     }
 40     mv_string[CSIZE] = ENDSTRING ;
 41     
 42     for ( int j = 0 ;  s[j] != '\0' ;  j++ )
 43     {
 44         mv_string[j] = s[j] ;
 45     }
 46     mv_string[CSIZE] = ENDSTRING ;
 47 }
 48 
 49 ~c_string()
 50 {
 51     mv_size = 0 ;
 52     delete [] mv_string ;
 53     //mv_string = nullptr ;
 54     
 55     cout <<"[~c_string]#\t" ;
 56     cout << "obj_num := " << --(c_string::sv_objcounter) ;
 57     cout << ",  size := " << mv_size ; 
 58     cout << ",  pt_string := " << mv_string << endl;
 59 }
 60 
 61 void mf_set_string( const char *s )
 62 {
 63     if ( mv_string != nullptr )
 64     {
 65         delete mv_string ;
 66         mv_size  =  0 ;
 67     }
 68 
 69     for ( int i = 0 ;  s[i] != '\0' ;  i++ )
 70     {
 71         ++(mv_size) ;
 72     }
 73 
 74     const int CSIZE = mv_size + 1 ;
 75     mv_string  =  new char[CSIZE] ;
 76     if ( mv_string == nullptr )
 77     {
 78         cout << "[error]#\t Lack Memory. " << endl ;
 79         exit (1) ;
 80     }
 81     mv_string[CSIZE] = ENDSTRING ;
 82     
 83     for ( int j = 0 ;  s[j] != '\0' ;  j++ )
 84     {
 85         mv_string[j] = s[j] ;
 86     }
 87     mv_string[CSIZE] = ENDSTRING ;
 88 }
 89 
 90 char* mf_get_string()
 91 {
 92     return mv_string;
 93 }
 94 
 95 int mf_get_size()
 96 {
 97     return mv_size;
 98 }
 99 
100 void mf_out()
101 {
102     cout <<"[c_string]#\t" << mv_string << ",  " << mv_size << endl;
103 }
104 
105 };  
106 int c_string::sv_objcounter = 0 ;
107 //  c_string::end
108 
109 void f_char()
110 {
111     char s[] = "helloworld" ;
112     cout << "[os]#\t" << "char_output:begin" << endl;
113     int size = 0;
114     for ( int i=0 ; s[i] != '\0' ; i++ )
115     {
116         cout << "[os]#\t" << s[i] << endl ;
117         ++size ;
118     }
119     cout << "[os]#\tsize := " << size << endl;
120     cout << "[os]#\t" << "char_output:end" << endl;
121 }
122 
123 void f_string()
124 {
125     std::string s = "helloworld";
126     cout << "[os]#\t" << "string_output:begin" << endl;
127     int size = 0;
128     for ( int i=0 ; s[i] != '\0' ; i++ )
129     {
130         cout << "[os]#\t" << s[i] << endl ;
131         ++size ;
132     }
133     cout << "[os]#\tsize := " << size << endl;
134     cout << "[os]#\t" << "string_output:end" << endl;    
135 }
136 
137 void f_run()
138 {
139     //f_char() ;
140     //f_string() ;
141     
142     c_string s("sun-wukong");
143     s.mf_out();
144     
145     c_string z("zhu-wujing");
146     //c_string z{"zhu-wujing"};
147     z.mf_out();
148     
149     c_string t;
150     t.mf_set_string("tang-xuanzang");
151     t.mf_out();
152 }
153 
154 // test part
155 int main()
156 {
157     f_run() ;
158     return 0 ;
159 }

 

 

 

三、运行

1 g++ -std=c++20 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
2 
3 
4 [c_string]#    sun-wukong,  10
5 [c_string]#    zhu-wujing,  10
6 [c_string]#    tang-xuanzang,  13
7 [~c_string]#    obj_num := 2,  size := 0,  pt_string := 
8 [~c_string]#    obj_num := 1,  size := 0,  pt_string := `
9 [~c_string]#    obj_num := 0,  size := 0,  pt_string := @

 

 

 

四、参考资料:

 

  1、  nullptr, the pointer literal (since C++11)  --  https://en.cppreference.com/w/cpp/language/nullptr

 

posted on 2024-01-25 06:31  lnlidawei  阅读(3)  评论(0编辑  收藏  举报