2012-12-10 26 views
5

Nếu tôi có mã mà thông thường sẽ hoạt động như thế này:Gửi shared_ptr cho OpenGL?

char* log = new char[logLength]; 
glGetProgramInfoLog(..., ..., log) 
//Print Log 
delete [] log; 

Làm thế nào tôi có thể đạt được kết quả tương tự với C++ 11 thông minh con trỏ? Ai biết được điều gì có thể xảy ra trước khi tôi có cơ hội xóa bộ nhớ đó.

Vì vậy, tôi đoán tôi cần downcast cho một con trỏ kiểu C?

+0

bằng cách này các con trỏ thông minh không phải là C++ 11 độc quyền ... – user1797612

+0

này không trả lời câu hỏi của bạn, nhưng tôi chỉ đơn giản là sẽ sử dụng một 'vector ' như trong [ví dụ này] (https: //github.com/progschj/OpenGL-Examples/blob/master/01shader_vbo1.cpp#L49). –

Trả lời

5

Nếu mã của bạn thực sự trông giống như vậy trong đoạn mã của bạn, shared_ptr là một chút quá mức cần thiết cho tình huống, vì có vẻ như bạn không cần quyền sở hữu chung của bộ nhớ được cấp phát. unique_ptr có chuyên môn hóa một phần cho các mảng phù hợp hoàn hảo cho các trường hợp sử dụng đó. Nó sẽ gọi delete[] trên con trỏ được quản lý khi nó nằm ngoài phạm vi.

{ 
    std::unique_ptr<char[]> log(new char[logLength]); 
    glGetProgramInfoLog(..., ..., log.get()); 
    //Print Log 
} // allocated memory is released since log went out of scope 
3

std::shared_ptr có phương thức get mà bạn có thể sử dụng để chuyển con trỏ kiểu C đến biến. Nếu con trỏ đó là số std::string, bạn cần gọi thêm hàm c_str() để nhận con trỏ đến chuỗi kiểu C.

chỉnh sửa: Tôi nhận thấy hàm đang ghi vào chuỗi thay vì đọc. Bạn sẽ cần phải thay đổi kích thước std :: string đầu tiên, và thậm chí sau đó, the pointer returned by c_str isnt meant for writing. std :: shared_ptr nên làm việc mặc dù.

+0

Để viết, bạn có thể sử dụng & str [0]. Trong C++ 11 nó được guarateed để làm việc (tiêu chuẩn đòi hỏi phải phân bổ lưu trữ) – milleniumbug

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