Tôi biết tiêu đề nghe có vẻ quen thuộc vì có nhiều câu hỏi tương tự, nhưng tôi đang hỏi về một khía cạnh khác của vấn đề (tôi biết sự khác biệt giữa việc có mọi thứ trên chồng và đặt chúng vào đống).
Trong Java tôi luôn có thể trả về các tham chiếu đến các đối tượng "cục bộ"
public Thing calculateThing() {
Thing thing = new Thing();
// do calculations and modify thing
return thing;
}
Trong C ++, để làm một cái gì đó tương tự tôi có 2 tùy chọn
(1) Tôi có thể sử dụng tài liệu tham khảo bất cứ khi nào tôi cần "trả lại" một đối tượng
void calculateThing(Thing& thing) {
// do calculations and modify thing
}
Sau đó sử dụng nó như thế này
Thing thing;
calculateThing(thing);
(2) Hoặc tôi có thể trả về một con trỏ tới một đối tượng được phân bổ động
Thing* calculateThing() {
Thing* thing(new Thing());
// do calculations and modify thing
return thing;
}
Sau đó sử dụng nó như thế này
Thing* thing = calculateThing();
delete thing;
Sử dụng cách tiếp cận đầu tiên tôi sẽ không phải giải phóng bộ nhớ theo cách thủ công, nhưng với tôi nó làm cho mã khó đọc. Vấn đề với cách tiếp cận thứ hai là, tôi sẽ phải nhớ delete thing;
, trông không đẹp lắm. Tôi không muốn trả về một giá trị được sao chép vì nó không hiệu quả (tôi nghĩ vậy), vì vậy đây là câu hỏi
- Có giải pháp thứ ba (không yêu cầu sao chép giá trị) không?
- Có bất kỳ vấn đề nếu tôi dính vào giải pháp đầu tiên?
- Khi nào và tại sao tôi nên sử dụng giải pháp thứ hai?