2012-12-27 43 views
6

Nếu tôi cócon trỏ - trùng lặp đối tượng dụ

Class *a1 = new Class(); 
Class *b1 = a1; 

delete b1; 
delete a1; //this will give a double free or corruption message; 

nếu tôi xóa con trỏ b, nó giống như xóa con trỏ một phải không? Vì cả hai đang trỏ vào cùng một thể hiện của Class. Vì vậy, làm thế nào tôi có thể sao chép các ví dụ của a1 để b1 để khi tôi xóa b1, a1 là không bị xóa.

Class *a1 = new Class(); 
Class *b1 = a1; 

//how do I duplicate the instance a1 is pointing 
//so that when I delete b1, a1 still exists. 

delete b1; 
delete a1; //this is still valid 

Cảm ơn.

+1

Không chắc chắn về tất cả các con trỏ là cần thiết, nhưng 'Class * b1 = new Class (* a1);' nên làm điều đó. – chris

+0

Đảm bảo rằng hàm tạo bản sao của bạn là OK và tạo bản sao mới từ * a1. – halfelf

+0

Điều đó thật dễ dàng @. @ Cảm ơn – tambalolo

Trả lời

10

Có lý do nào khiến bạn đang sử dụng con trỏ và phân bổ không? Khác của nó đơn giản là

Class a1; 
... 
Class b1 = a1; 

Không cần xóa ở đây.

Nếu bạn cần để giữ cấu trúc vì nó là bạn cần làm

Class *a1 = new Class(); 
Class *b1 = new Class(*a1); 

hoặc

Class *a1 = new Class(); 
Class *b1 = new Class(); 
*b1 = *a1; 

này giả sử bạn có một bản sao-constructor hợp lệ (ví dụ # 1) hoặc phân công điều hành (ví dụ: # 2)

ps: cố gắng sử dụng std::unique_ptr thay cho con trỏ thô để an toàn hơn.

+2

Điều gì sẽ xảy ra nếu ai đó đã viết Lớp và họ không thêm người tạo bản sao hoặc nhà điều hành chuyển nhượng? – corro

Các vấn đề liên quan