2011-08-24 33 views
6

Tôi biết có một toán tử xóa mà tôi không quan tâm ở đâu đó. Tôi chỉ tự hỏi, wow, nó đã hoạt động. Đối số "kích thước" đến từ đâu?`Kích thước` đến từ đâu?

#include<iostream> 
#include<string> 

class Base { 
public: 
    Base() { } 
    void *operator new(unsigned int size, std::string str) { 
    std::cout << "Logging an allocation of "; 
    std::cout << size; 
    std::cout << " bytes for new object '"; 
    std::cout << str; 
    std::cout << "'"; 
    std::cout << std::endl; 
    return malloc(size); 
    } 
private: 
    int var1; 
    double var2; 
}; 

int main(int argc, char** argv){ 
    Base* b = new ("Base instance 1") Base; 
} 

Dưới đây là kết quả:

Logging một phân bổ 16 byte cho đối tượng mới 'cơ sở dụ 1'

+2

Bạn đang xem một số f các tính năng C++ tiên tiến. Là một người mới bắt đầu, bạn nên tập trung vào những thứ cơ bản hơn. – user763305

+0

Hãy coi chừng, kích thước của một đối tượng và số lượng byte được phân bổ có thể khác nhau do căn chỉnh, đệm và các chi phí khác! Đặc biệt đúng đối với mảng. Đừng cho rằng đối tượng được đặt tại địa chỉ mà bạn đã trả về trong toán tử mới của bạn, vì nó có thể không được! – Frigo

+0

Thực ra từ tiêu chuẩn 5.3.4/12: "kết quả T mới trong cuộc gọi của toán tử mới (sizeof (T))". Nếu bạn muốn bất kỳ sự liên kết đặc biệt nào, bạn sẽ phải tự cung cấp nó và đối tượng sẽ được đặt tại địa chỉ được trả lại từ mới. –

Trả lời

12

Nó được cung cấp bởi trình biên dịch tại thời gian biên dịch. Khi trình biên dịch thấy:

new ("Base instance 1") Base; 

nó sẽ thêm một cuộc gọi đến:

Base::operator new(sizeof(Base), "Base instance 1"); 

EDIT: Trình biên dịch sẽ tất nhiên cũng có thêm một cuộc gọi đến Base::Base()

+0

Bạn thật tuyệt vời! Cảm ơn bạn! Amazing.I đã thay đổi mã và nhận được lỗi: thông số chính thức đầu tiên cho 'toán tử mới' phải là 'size_t'Tôi biết thêm một chút về new.Thanks một lần nữa. – Mike

0

trên 32 bit vòm int là 4 byte, gấp đôi là 8, nhưng giá trị gấp đôi sẽ được căn chỉnh thành 8 byte để kích thước = 4 + 4 (khoảng trống) + 8 = 16

+0

câu hỏi không phải là kích thước của loại đã tồn tại, nhưng về tham số kích thước mới, và nó sẽ được điền từ đâu – PlasmaHH

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