30/09/2018, 17:57

Khác nhau về Destructor trong C++ giữa Code::Blocks và Visual Studio

Xin chào mọi người!

Em có một vấn đề liên quan đến destructor trong C++ muốn hỏi.

Em post code để mọi người dễ tham khảo

#include <iostream>

class Test
{
private:
	char c;
public:
	Test(char cc = '') {
		c = cc;
	}

	~Test() {
		std::cout << "Destructor of " << c << std::endl;
	}

	Test Cong(Test t) {
		Test kq('k');
		return kq;
	}
};

int main() {
	Test a('a'), b('b');
	a.Cong(b);
	return 0;
}

Còn đây là kết quả của đoạn code trên khi chạy trên Visual Studio và Code::Blocks.

Kết quả của Code::Blocks thì trùng với suy nghĩ của em trước khi chạy chương trình. Nhưng khi chạy trong Visual thì lại có thêm dòng “Destructor of k” thứ hai, em không hiểu tại sao lại như vậy. Em mong mọi người giải đáp giúp

Đây là lần đầu tiên post bài, nếu có gì sai sót mong mọi người thông cảm, em xin rút kinh nghiệm

viết 20:09 ngày 30/09/2018

là do compiler của VS đọc code sao hiểu vậy, còn g++ thì thông minh hơn 1 tí, cái Test kq trong method Cong được trả về chính nó luôn, thay vì trả về bản copy của nó như trong cái code.

VS:
tạo a
tạo b
tạo copy của b để truyền vào a.Cong(b)
thực hiện a.Cong(b): tạo biến tạm kq, trả về copy của kq, tức là tạo thêm 1 biến copy của kq nữa.
sau khi thực hiện xong a.Cong(b): giải phóng biến tạm kq (biến copy của kq chưa được giải phóng), giải phóng copy của b, rồi vì biến copy của kq ko được sử dụng nên giải phóng luôn. => k b k

g++:
tạo a
tạo b
tạo copy của b để truyền vào a.Cong(b)
thực hiện a.Cong(b): tạo biến tạm kq, trả về chính kq (ko copy ra biến mới)
sau khi thực hiện xong a.Cong(b): giải phóng kq vì trong main() ko sử dụng, rồi giải phóng copy của b

nếu sử là Test c = a.Cong(b); thì vì biến trả về của a.Cong(b) có “sử dụng” trong main() (biến c), nên biến kq sẽ ko được giải phóng khi thoát khỏi a.Cong(b), nó chỉ được giải phóng sau khi main() kết thúc. => b k b a thay vì k b b a.

edit: đúng ra phải là b k chứ ko phải k b, ở đây vì method Cong chỉ được sử dụng 1 lần nên hình như g++ nó optimize thành ko return gì luôn hay sao ấy =)

Bài liên quan
0