01/10/2018, 17:43
Thắc mắc về destructor C++
Mình có code như sau
STRING& STRING::operator+(const STRING &t)
{
STRING temp;
temp.s = new char[size(t) + size(s) + 1];
int i = 0;
int j = 0;
while (j < size(s))
{
temp.s[i++] = s[j++];
}
j = 0;
while (j < size(t))
{
temp.s[i++] = t.s[j++];
}
temp.s[size(t) + size(s)]=' ';
return temp;
}
Tại sao mình return về temp rồi mà destructor vẫn chạy và xóa dữ liệu của temp vậy ạ ?
Bài liên quan
Vì
temp
là local màThực sự compiler khéo sẽ bỏ qua bước copy từ local ra một đối tượng tạm (còn gọi là NRVO). C++17 bắt buộc phải bỏ bước này.
vậy có cách nào khắc phục không bạn, đây hàm cộng hai chuỗi trong lớp STRING mà mình tự cài đặt.
Cảm ơn bạn.
trả về 1 object hẳn luôn chứ ko trả về 1 reference tới local object
Vẫn bị mất bạn ơi, destructor vẫn xóa:
mất chỗ nào ~.~ nếu là mất khi thoát main() thì đúng rồi?
Bạn có viết
operator=
không đó Rule of 3 là phải viết đủ: copy, assignment, destructor.mình debug hết rồi bạn ơi tới bước
temp.s[size(t) + size(s)]='\0';
thằng temp vẫn là kết quả đúng f10 thêm lần nữa nó nhảy qua destructor luôn.
Bạn viết đúng
operator=
thì cáitemp
ra làm sao kệ nó vậy bạn chưa viết assignment op rồi.vừa ra khỏi hàm là mất luôn ạ quay trở lại main là không bị xóa rồi ạ
Mình viết rồi bạn, cái quan trọng là debug thì nó đã bị xóa rồi và trả về một chuỗi đã bị xóa đó bạn
bưng hết code lên đây, đã xóa dấu
&
trong giá trị trả về của operator+ chưa??edit: code gì lạ vậy, Hàm
size()
trongsize(t)
vớisize(s)
1 cái nhậnSTRING
1 cái nhậnchar*
à :Vcho mình hỏi ngu cái…
Biến temp là local thì ra khởi hàm bị xóa là phải rồi mà… phải ko ta???
nếu trả về bản copy thì nó copy ra, ko bị xóa
khi viết trả về bản copy, trình biên dịch nó khôn hơn, nó ko cần copy mà trả về thẳng
n
luôn, ko cần copy ra n mới rồi xóa n cũ rồi trả về n mới, ở đây nó trả về thẳng n cũ luôn. Còn trả vềint&
thì nó ko được thông minh cho lắm, nó cũng trả về n cũ, cũng ko copy ra n mới, nhưng lại xóa n cũ :Vdzậy quẳng hết code lên đây mới coi được lỗi chỗ nào, code lớp string trong C++ có sẵn rồi. có quý giá gì đâu mà giấu dữ vậy @_@
coi có thiếu copy ctor ko?
thiếu copy ctor rồi đó. Nó như thế này:
chắc do chạy debug nên nó vẫn phải copy ra object mới rồi xóa
temp
, ko trả về thẳng cáitemp
luôncopy ctor giống với operator=, nhưng operator= gán khi đã có object rồi, còn copy ctor thì gán khi object chưa có gì:
google thêm rule of three với rule of five nha, mỗi khi xài cấp phát động trong class là phải viết đủ 3/5 cái phương thức này
nếu ko viết copy ctor thì C++ nó sẽ viết dùm bạn, và nó xài shallow copy, nghĩa là nó chỉ copy đơn giản thế này:
this->s = t.s;
, rất “nông cạn” (shallow). Dẫn tới sau đó khit.s
bị xóa thìthis->s
cũng bị xóa theo. Bạn phải viết thêm copy ctor để deep copy ra mảng mới chothis->s
ok mình hiểu rồi cảm ơn bạn nhiều!!!