Tôi đang làm việc trên một đoạn mã có nhiều điểm lỗi có thể khiến nó thoát khỏi chức năng sớm. Các thư viện tôi đang tương tác với yêu cầu các mảng kiểu C được truyền cho các hàm. Vì vậy, thay vì gọi xóa trên các mảng tại tất cả các điểm xuất cảnh, tôi đang làm điều này:Bạn có thể sử dụng shared_ptr cho RAII của mảng kiểu C không?
void SomeFunction(int arrayLength)
{
shared_ptr<char> raiiArray(new char[arrayLength]);
pArray = raiiArray.get();
if(SomeFunctionThatRequiresCArray(pArray) == FAILED) { return; }
//etc.
}
Tôi muốn sử dụng unique_ptr
, nhưng trình biên dịch hiện tại của tôi không hỗ trợ nó và tham chiếu đếm trên đầu không thực sự quan trọng trong trường hợp này.
Tôi chỉ tự hỏi liệu có ai có bất kỳ suy nghĩ nào về thực tiễn này khi giao tiếp với mã cũ không.
CẬP NHẬT Tôi hoàn toàn quên mất shared_ptr
gọi delete
thay vì delete []
. Tôi chỉ thấy không có rò rỉ bộ nhớ và quyết định đi với nó. Thậm chí không nghĩ đến việc sử dụng một véc-tơ. Kể từ khi tôi đã được delving vào mới (đối với tôi) C + + gần đây tôi nghĩ rằng tôi đã có một trường hợp của "Nếu công cụ duy nhất bạn có là một cái búa, tất cả mọi thứ trông giống như một móng tay." hội chứng. Cảm ơn vì bạn đã phản hồi.
UPDATE2 Tôi figured tôi sẽ thay đổi câu hỏi và cung cấp một câu trả lời để làm cho nó có giá trị hơn một chút cho ai đó làm cho cùng một sai lầm tôi đã làm. Mặc dù có những lựa chọn thay thế như scoped_array
, shared_array
và vector
, bạn có thể sử dụng một shared_ptr
để quản lý phạm vi của một mảng (nhưng sau này tôi không có ý tưởng tại sao tôi muốn):
template <typename T>
class ArrayDeleter
{
public:
void operator() (T* d) const
{
delete [] d;
}
};
void SomeFunction(int arrayLength)
{
shared_ptr<char> raiiArray(new char[arrayLength], ArrayDeleter<char>());
pArray = raiiArray.get();
if(SomeFunctionThatRequiresCArray(pArray) == FAILED) { return; }
//etc.
}
nitpicking: [[shared_ptr]] không hoạt động chính xác trên con trỏ mảng động. sử dụng [[scoped_array]] hoặc [[shared_array]]. – rwong