Tôi đang cố gắng tìm hiểu về các vùng bộ nhớ trong C++ để có tốc độ và khả năng gỡ lỗi tốt hơn. Tôi đã theo dõi cách tiếp cận được tìm thấy ở đây: http://oroboro.com/overloading-operator-new/. Vì vậy, tôi đã quá tải new
, new[]
, delete
, và delete[]
như thế này:Xóa quá tải toàn cầu [] không được gọi trong thư viện của bên thứ ba
inline void* operator new (size_t size) { return myAlloc(size); }
inline void* operator new[] (size_t size) { return myAlloc(size); }
inline void operator delete (void* ptr ) { myFree(ptr); }
inline void operator delete[](void* ptr ) { myFree(ptr); }
Tôi thích rằng thư viện của bên thứ ba đang hướng đến phiên bản này của new
, nhưng tôi chạy vào một vấn đề. Tôi đang tạo một ứng dụng DirectX sử dụng DXUT. Tôi biên dịch DXUT tách biệt khỏi dự án của tôi. Cuối cùng nó gọi:
std::unique_ptr<D3D11_SUBRESOURCE_DATA[]> initData(new (std::nothrow) D3D11_SUBRESOURCE_DATA[ mipCount * arraySize ]);
Khi con trỏ độc đáo này đi ra khỏi phạm vi, nó bị treo trên một cuộc gọi đến delete[] _Ptr
, mà không đi qua nhà khai thác quá tải của tôi. Tôi đã thử gỡ lỗi triển khai pool bộ nhớ của mình bằng cách thêm một số int* dummy = new int[10]; delete[] dummy;
trong số main
. Xây dựng dự án đã đưa ra một lỗi, nhưng tòa nhà sạch sẽ hoạt động tốt. Trước sự ngạc nhiên của tôi, mọi thứ đã hoạt động, kể cả dòng DXUT đã bị hỏng!
Câu hỏi 1: Chính xác điều gì đã xảy ra khi tôi thêm dòng gỡ lỗi đã khắc phục sự cố? Tôi đoán vì lý do nào đó mà toán tử delete [] của tôi không được biết đến cho đến khi tôi gọi nó trong mã ứng dụng của riêng mình? Điều này có được đảm bảo để khắc phục sự cố hoặc nó chỉ là may mắn không?
Câu hỏi 2: Tôi nhận thấy rằng new (std::nothrow) D3D11_SUBRESOURCE_DATA[ mipCount * arraySize ]
không gọi trực tiếp số operator new[]
của tôi, nhưng cuối cùng được gọi là operator new
(không có dấu ngoặc vuông). Nó vẫn gọi toán tử delete[]
trên con trỏ. Điều này có gây ra vấn đề không? Tôi có phải thêm quá tải thích hợp sao cho số operator new[]
của tôi được gọi hoặc hành vi này có ổn không?
Để tham khảo, các operator new[]
quá tải mà được gọi là:
void * __CRTDECL operator new[](::size_t count, const std::nothrow_t& x)
_THROW0()
{ // Try to allocate count bytes for an array
return (operator new(count, x));
}
Xóa nội tuyến và đặt mã vào tệp triển khai thay vì tiêu đề đã hoạt động! Tôi tự hỏi tại sao liên kết tôi sao chép từ đó không đề cập gì về nó. – DSM