2010-10-25 30 views
8

Tôi đã overloadded mới [] như thế nàyTruy vấn mới [] của C++ đã quá tải: Kích thước nào lấy tham số? điều hành

void * human::operator new[] (unsigned long int count){ 
     cout << " calling new for array with size = " << count << endl ; 
     void * temp = malloc(count) ; 
     return temp ; 
} 

và bây giờ gọi

human * h = new human[14] ; 

nói sizeof(human) = 16, nhưng đếm nó in là 232 mà là 14 * 16 + sizeof (int *) = 224 +8.

Tại sao không gian bổ sung này được phân bổ? Và nó ở đâu trong trí nhớ? Vì khi tôi in *h HOẶC h[0] Tôi nhận được kết quả tương tự, do đó, nó không ở đầu bộ nhớ. Có đúng không HOẶC tôi đang thiếu một số thứ ở đây?

+1

Câu hỏi hay. Tuy nhiên, nitpicker bên trong tôi cần phải chỉ ra rằng bạn không kiểm tra malloc() trả về một con trỏ null. – sharptooth

+0

@sharptooth: ur đúng nhưng đó là cố ý coz tôi muốn tập trung vào câu hỏi thực sự và không thêm quá nhiều ifs :) Lý tưởng nhất là cần kiểm tra temp! = 0 khác ném một số ngoại lệ (bad_alloc kinda) –

+0

byte bổ sung là để lưu trữ số byte được phân bổ. Nhưng nơi nó lưu trữ được thực hiện phụ thuộc. – bjskishore123

Trả lời

6

Không gian bổ sung được phân bổ được sử dụng để lưu trữ kích thước của mảng để sử dụng nội bộ (trong thực tế sao cho delete[] biết số lượng cần xóa).

được lưu trữ ở đầu phạm vi bộ nhớ, ngay lập tức trước&h. Để xem điều này, chỉ cần xem xét giá trị của temp bên trong số operator new[] của bạn. Giá trị sẽ khác với giá trị trong &h.

3

Nó là để lưu trữ số lượng các đối tượng được phân bổ để khi bạn gọi delete[] số lượng đối tượng thích hợp sẽ bị xóa. Xem chi tiết FAQ này để biết thêm chi tiết.

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