Tôi hiện đang nhận được bản thân mình vào c + + cho mã hóa cấp thấp hơn với opengl. Tôi đến từ một nền objc nặng vì vậy tôi có một số hiểu biết về quản lý bộ nhớ nhưng tôi dường như không thể có được như thế nào "tăng" thư viện quản lý các loại container như ptr_vector
.Ptr_vector quản lý bộ nhớ như thế nào?
Tôi nghĩ rằng vấn đề của tôi liên quan đến thực tế là tôi không biết làm thế nào ptr_vector
quản lý sự phá hủy của chính nó và các đối tượng của nó.
Xin hãy nhìn vào đoạn mã sau:
// Header file
...
ptr_vector<IObject3D> objects;
...
// Implementation file
...
void ApplicationEngine::init()
{
WavefrontObject3D *object = new WavefrontObject3D("Ninja.obj");
objects.push_back(object);
}
...
Vì vậy, đối với thực chất vấn: Tôi tạo ra một sự rò rỉ ở đây thông qua các "đối tượng" biến?
Tôi đang sử dụng để duy trì và giải phóng đối tượng của tôi bằng tay với các cuộc gọi rõ ràng trong objc: trước đây tôi đã phải alloc init
các WavefrontObject3D object
, thêm nó vào một mảng và sau đó release
cùng đối tượng để tránh rò rỉ.
Nhưng khi tôi thêm delete object
sau khi gọi số push_back
, thì hàm gọi deconstructor của WavefrontObject3D object
được gọi. Điều này cho tôi một gợi ý rằng ptr_vector
không giữ lại biến số object
. Giả định của tôi có đúng không?
bổ sung, nhưng có liên quan, câu hỏi: chúng ta hãy nói rằng tôi muốn để tiêu diệt các lớp chứa ApplicationEngine
tôi không phải gọi một số loại deconstructor trên ptr_vector
hoặc các yếu tố nó quản lý?
'Nhưng khi tôi thêm đối tượng xóa sau cuộc gọi push_back, bộ giải mã của đối tượng WavefrontObject3D được gọi là' 'Vâng đó là những gì' xóa' được tạo cho. Nó gọi hàm hủy trên cá thể con trỏ trỏ tới. – Nobody
Tôi nghĩ bạn nên đọc trên [RAII] (http://stackoverflow.com/q/395123/20984), đó là cách hầu hết quản lý bộ nhớ được thực hiện trong cái gọi là "hiện đại" C++. –
Tài nguyên tuyệt vời @LucTouraille! Chính xác cách tôi muốn tiếp cận C++. – polyclick