Có thể dễ hiểu hơn nếu bạn tưởng tượng việc xây dựng một số đối tượng MyClass trong một số một khối.
Trong trường hợp đó, nó sẽ đi một cái gì đó như:
- Phân bổ một khối khổng lồ của bộ nhớ sử dụng char mới [10 * sizeof (MyClass)] hoặc malloc (10 * sizeof (MyClass))
- Sử dụng vị trí mới để xây dựng mười đối tượng MyClass trong bộ nhớ đó.
- Làm điều gì đó.
- Gọi trình phá hủy của từng đối tượng của bạn
- Giải quyết khối bộ nhớ lớn bằng cách xóa [] hoặc miễn phí().
Đây là loại điều bạn có thể làm gì nếu bạn viết một trình biên dịch, hoặc một hệ điều hành vv
Trong trường hợp này, tôi hy vọng đó là rõ ràng lý do tại sao bạn cần "destructor" riêng và "xóa" các bước, bởi vì không có lý do gì khiến bạn sẽ xóa cuộc gọi.Tuy nhiên, bạn nên deallocate bộ nhớ tuy nhiên bạn thường làm điều đó (miễn phí, xóa, không làm gì cho một mảng tĩnh khổng lồ, thoát bình thường nếu mảng là một phần của đối tượng khác, v.v.) và nếu bạn không nó sẽ bị rò rỉ. Cũng lưu ý như Greg nói, trong trường hợp này, bạn không thể sử dụng xóa, bởi vì bạn đã phân bổ mảng với [] mới, do đó bạn cần phải sử dụng delete []. Cũng cần lưu ý rằng bạn cần giả định rằng bạn không ghi đè xóa cho MyClass, nếu không nó sẽ làm điều gì đó hoàn toàn khác mà gần như chắc chắn không tương thích với "mới".
Vì vậy, tôi nghĩ bạn không muốn gọi "xóa" như bạn mô tả, nhưng nó có thể hoạt động không? Tôi nghĩ rằng đây là cơ bản cùng một câu hỏi như "Tôi có hai loại không liên quan mà không có destructors. Tôi có thể mới một con trỏ đến một loại, sau đó xóa bộ nhớ thông qua một con trỏ đến một loại?" Nói cách khác, "trình biên dịch của tôi có một danh sách lớn của tất cả các công cụ được phân bổ, hoặc nó có thể làm những việc khác nhau cho các loại khác nhau".
Tôi sợ rằng tôi không chắc chắn. Đọc spec nó nói:
5.3.5 ... Nếu loại tĩnh của các toán hạng [của các nhà điều hành xóa] là khác biệt so với loại động của nó, loại tĩnh sẽ là một lớp cơ sở của toán hạng của loại động và loại tĩnh sẽ có một destructor ảo hoặc hành vi không xác định.
Tôi nghĩ điều đó có nghĩa là "Nếu bạn sử dụng hai loại không liên quan, nó không hoạt động (bạn có thể xóa đối tượng lớp một cách đa hình thông qua trình phá hủy ảo)."
Vì vậy, không, đừng làm vậy. Tôi nghi ngờ nó thường có thể làm việc trong thực tế, nếu trình biên dịch chỉ nhìn vào địa chỉ và không phải là loại (và không phải loại là một lớp đa thừa kế, mà sẽ mangle địa chỉ), nhưng không thử nó.
+1 Câu hỏi hay, tôi rất muốn hiểu điều đó. – AraK
Về mặt kỹ thuật, vị trí 'mới' không cấp phát bộ nhớ. Nhưng đó là một chi tiết trong bối cảnh này. – Griwes
@Griwes: +1 Có thể cho rằng đó là điểm cơ bản :) –