30/09/2018, 22:40

Chút thắc mắc về pointer c++

Chào mọi người, mình có đang làm một project c++. Như mọi người đã biết thì có 2 cách để tạo ra một object mới đó là khai báo trực tiếp Object và khai báo con trỏ sau đó new Object đó
Object A

Object *A = new Object()

Mình không biết phân biệt 2 trường hợp này, cái nào tốt hơn trong việc tránh memory leaking và tối ưu ram. Vì trước đó mình code Java chỉ có khái niệm Object và nó tự destroy khi thoát khỏi scope và tự destroy khi không không có reference nào trỏ đến nó. Trong 2 cái trên của c++ thì cái nào chức năng gần hơn với Object trong Java?

Xin cảm ơn!!

kiencon viết 00:44 ngày 01/10/2018

Mình thì chưa học C++ năm tới mới học nhưng mình thấy 2 cách khai báo này tương tự như khai báo biến bình thường, khai báo đầu có thể là cấp phát bộ nhớ tĩnh, còn khai báo thứ 2 là cấp phát động cụ thể là dùng con trỏ và new.

Trần Thị Diệu Ninh viết 00:46 ngày 01/10/2018

khai báo kiểu 1 thì khởi tạo và hủy là auto, còn khai báo kiểu 2 với con trỏ thì mình sẽ chủ động trong việc khởi tạo và hủy . Do đó, theo cách thứ 2 , nếu ta quên hủy con trỏ thì việc memory leaking dễ xảy ra hơn, Mình nghĩ như vậy

viết 00:56 ngày 01/10/2018

cách 2 gần với Java hơn, đúng hơn là giống hệt Java. Trong Java bất kì object nào cũng nằm trên heap, tức là cấp phát động trường hợp 2, trừ các kiểu nguyên thủy là nằm trên stack. Nếu bạn khởi tạo 1 biến trên Java = new T(…) tức là nó nằm trên heap rồi đó. Java nó chỉ hạn chế ko cho sử dụng pointer arithmetic (cộng trừ pointer) rồi gọi pointer là “reference”.

Java khác với C++ ở chỗ Java có người thu dọn dùm, gọi là garbage collector, người thu dọn rác. C++ object nào cấp phát động cái gì phải tự thu dọn cái đó, nhưng có destructor thì mình ko cần tự thu dọn mà để object tự dọn. Nếu con trỏ/reference trong Java có GC lo thì con trỏ trong C++ sẽ được viết lại thành 1 class để có destructor lo. Vì vậy viết code C++11 thì tuyệt đối ko xài new/delete hay raw pointer mà phải xài unique_ptr, shared_ptr. Ví dụ

class Person
{
public:
    Person(int id, const std::string& name) : id(id), name(name) {}
private:
    int id;
    std::string name;
};

...
Person john(101, "John"); //john nằm trên stack
//Person* pAlice = new Person(102, "Alice"); //ko viết như vậy nữa
auto pAlice = std::make_shared<Person>(102, "Alice"); //nên viết như vậy, ko sợ leak memory

unique_ptr lẹ hơn shared_ptr nhưng cách xài phức tạp hơn. Ngoài ra còn có weak_ptr để tránh liên kết vòng bằng shared_ptr. Phức tạp hơn con trỏ thông thường nhiều nên người ta ít xài mặc dù nếu xài thì chả phải lo leak memory nữa.

Tao Không Ngu. viết 00:54 ngày 01/10/2018

This post was flagged by the community and is temporarily hidden.

Bài liên quan
0