2010-03-21 39 views

Trả lời

17

Bạn có thể làm điều đó nhưng tôi không chắc chắn lý do tại sao bạn sẽ muốn làm điều đó.

Nếu bạn đang sử dụng auto_ptr để biểu thị quyền sở hữu của ptr (như mọi người thường làm), thì bạn chỉ cần chuyển auto_ptr thành hàm nếu bạn muốn chuyển quyền sở hữu của ptr cho hàm, trong đó trường hợp bạn sẽ vượt qua auto_ptr theo giá trị:

void DoSomething(auto_ptr<int> a) 

Vì vậy, bất kỳ mã gọi DoSomething tuyên bố từ bỏ quyền sở hữu của ptr:

auto_ptr<int> p (new int (7)); 
DoSomething (p); 
// p is now empty. 

Nếu không chỉ cần vượt qua ptr theo giá trị:

void DoSomething(int* a) 
{...} 

... 

auto_ptr<int> p (new int (7)); 
DoSomething (p.get()); 
// p still holds the ptr. 

hoặc vượt qua một ref đến nhọn để phản đối:

void DoSomething(int& a) 
{...} 

... 

auto_ptr<int> p (new int (7)); 
DoSomething (*p); 
// p still holds the ptr. 

Thứ hai là thường thích hợp hơn vì nó làm cho nó rõ ràng hơn rằng DoSomething dường như không cố gắng để xóa các đối tượng.

+1

truyền con trỏ theo giá trị không an toàn - có thể xảy ra rò rỉ bộ nhớ. tạo đối tượng không có 'mới' có nghĩa là đối tượng sẽ nằm trên ngăn xếp - không chắc chắn đó là cách tiếp cận tốt nhất. – amitlicht

+2

@eriks: Rò rỉ bộ nhớ * có thể * xảy ra trong nhiều tình huống; ngay cả khi bạn vượt qua một 'auto_ptr' bằng cách tham chiếu, ai đó có thể gọi' delete ptr.get() 'sẽ tồi tệ hơn. Việc truyền con trỏ theo giá trị không có thông tin về việc chuyển quyền sở hữu hoặc hình thức xóa chính xác như vậy - trong trường hợp không có tài liệu ngược lại - tôi không mong đợi được phép xóa đối tượng được trỏ tới. –

+0

@eriks: Bạn sẽ không bị rò rỉ bộ nhớ, bạn sẽ chỉ nhận được các con trỏ lúng túng. – kennytm

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