[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
本文由 lnlidawei 原创、整理、转载,本文来自于【博客园】; 整理和转载的文章的版权归属于【原创作者】; 转载或引用时请【保留文章的来源信息】:https://www.cnblogs.com/lnlidawei/p/17986230