Vì vậy, tôi đã luôn luôn được một chút mờ trên C + + con trỏ so với ... bất cứ điều gì khác được gọi là. Giống như,Trả về biến ngăn xếp?
Object* pointer = new Object();
vs
Object notpointer();
Tôi biết rằng con trỏ có lẽ liên quan đến một giây, nhưng về cơ bản đó là một không-con trỏ. (Có gì nó thực sự được gọi là?)
Hơn nữa, tôi tin rằng đối với một trong những đầu tiên, bạn phải gọi
delete pointer;
tại một số điểm khi bạn đang thực hiện với nó, phải không? Và cái kia bạn không cần phải lo lắng. Tôi đã đọc rằng đầu tiên được phân bổ trên heap, nhưng thứ hai được phân bổ trên stack, và biến mất khi phương thức trả về.
Tuy nhiên, khi bạn trả lại thứ gì đó (không phải nguyên thủy) từ một hàm?
Một ví dụ điển hình được viết bằng Should I return std::strings?:
std::string linux_settings_provider::get_home_folder() {
return std::string(getenv("HOME"));
}
Bởi những gì tôi đã viết trước đây, các chuỗi được cấp phát trên stack, và cần được giải phóng khi trở về chức năng, phải không? Tuy nhiên, không ai nói gì về điều đó, vì vậy tôi cho rằng nó hoạt động tốt. Tại sao?
Nói chung, sự khác biệt giữa
return new std::string("pointer");
và
return std::string("not-pointer");
là gì?
Ngoài ra, giả sử cả hai công việc, ưu và khuyết điểm của hai là gì?
Thứ hai là hàm. – chris
Bạn đang trộn một số khái niệm ở đây. Một con trỏ chỉ là một biến có thể chứa một địa chỉ bộ nhớ. 'New std :: string' đang thực hiện phân bổ bộ nhớ và xây dựng đối tượng. Hai thứ không cần thiết phải được sử dụng cùng nhau. Trong C++ hiện đại, bạn thường không làm điều này. – greatwolf
Chuỗi được phân bổ trên ngăn xếp. Đó là ** không ** giải phóng; nó bị phá hủy. Nhưng trình biên dịch sao chép nó trước khi phá hủy nó. –