2009-06-25 17 views
32

Tóm lại, tôi tự hỏi nếu có một kiểu auto_ptr giống như cho mảng. Tôi biết tôi có thể tự mình cuộn, tôi chỉ đảm bảo rằng không có thứ gì đó ở ngoài kia.auto_ptr cho mảng

Tôi cũng biết về vectơ. tuy nhiên tôi không nghĩ mình có thể sử dụng chúng. Tôi đang sử dụng một số API/SDK của Windows như Windows Media SDK, API hiển thị trực tiếp để lấy lại một số cấu trúc để gọi hàm có con trỏ và kích thước hai lần. Lần đầu tiên đi qua NULL là con trỏ để lấy lại kích thước của cấu trúc mà tôi phải phân bổ để nhận dữ liệu mà tôi đang tìm kiếm. Ví dụ:

CComQIPtr<IWMMediaProps> pProps(m_pStreamConfig); 
DWORD cbType = 0; 
WM_MEDIA_TYPE *pType = NULL; 

hr = pProps->GetMediaType(NULL, &cbType); 
CHECK_HR(hr); 

pType = (WM_MEDIA_TYPE*)new BYTE[cbType]; // Would like to use auto_ptr instread 
hr = pProps->GetMediaType(pType, &cbType); 
CHECK_HR(hr); 

// ... do some stuff 

delete[] pType; 

Kể từ cbType thường trở lại lớn hơn sizeof (WM_MEDIA_TYPE) do thực tế là có một con trỏ đến một cấu trúc trong nó, tôi không thể chỉ phân bổ đối tượng WM_MEDIA_TYPE. Có cái gì như thế này không?

Trả lời

41

Sử dụng

std::vector<BYTE> buffer(cbType); 
pType = (WM_MEDIA_TYPE*)&buffer[0]; 

hoặc kể từ C++ 11

std::vector<BYTE> buffer(cbType); 
pType = (WM_MEDIA_TYPE*)buffer.data(); 

để thay thế.


bổ sung: Nếu ai đó hỏi nếu Vectors are guaranteed to be contiguous câu trả lời là từ tiêu chuẩn 03 C++. Có một thread khác đã được thảo luận.


Nếu C++ 11 được hỗ trợ bởi trình biên dịch của bạn, unique_ptr có thể được sử dụng cho mảng.

unique_ptr<BYTE[]> buffer(new BYTE[cbType]); 
pType = (WM_MEDIA_TYPE*)buffer.get(); 
+0

Yup. Vectơ, không phải mảng. –

+0

Các vectơ được bảo đảm là các khối liên tiếp của bộ nhớ? – heavyd

+5

@Heavyd Có - tiêu chuẩn C++ đảm bảo điều này. –

3

Không có trong STL. Boost có một số con trỏ thông minh với một ý tưởng tương tự. Kiểm tra scoped_arrayshared_array

9

Không có gì trong thư viện std hiện tại. Tuy nhiên, tiêu chuẩn tương lai C++ 0x có một unique_ptr, thay thế cho auto_ptr, và nó hoạt động với các mảng.

Có thể tìm thấy triển khai đầu tiên tại đây: unique_ptr

+0

bạn nên làm rõ rằng để unique_ptr hoạt động, bạn sẽ cần phải cung cấp một deleter tùy chỉnh. –

+0

Không nhất thiết, xem phần "Hỗ trợ an toàn cho mảng" – Jem

+0

ahh, tôi đã sửa chữa. +1 cho bạn;). –

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