2011-10-02 36 views
8

Cập nhật: Sự cố sau đây dường như phụ thuộc vào tùy chọn -fwhole-program.Làm thế nào để std :: string cấp phát bộ nhớ trong GCC với chương trình -fwhole?

Tôi đã chơi xung quanh một chút với phân bổ bộ nhớ, và tôi gặp phải là một bí ẩn nhỏ: Trong GCC (4,6), như thế nào std::string cấp phát bộ nhớ của nó [chỉnh sửa] khi tôi biên dịch với -fwhole-program [/]?

Có chương trình thử nghiệm này sau:

#include <new> 
#include <string> 
#include <iostream> 
#include <cstdlib> 

void * operator new(std::size_t n) throw(std::bad_alloc) 
{ 
    void * const p = std::malloc(n); 

    if (p == NULL) throw std::bad_alloc(); 

    std::cerr << "new() requests " << n << " bytes, allocated at " << p << ".\n"; 

    return p; 
} 

void operator delete(void * p) noexcept 
{ 
    std::cerr << "delete() at " << p << ".\n"; 
    std::free(p); 
} 

int main() 
{ 
    std::string s = "Hello world."; 
} 

Khi tôi sử dụng bất kỳ container động khác (trong đó sử dụng std::allocator<T>), bộ cấp sử dụng ::operator new, và vì vậy tôi thấy các thông điệp debug hạnh phúc. Tuy nhiên, với std::string, tôi chẳng thấy gì cả. Tôi chắc chắn rằng phân bổ động xảy ra, mặc dù, như tôi có thể xác nhận với valgrind (13 cộng với chuỗi byte dài được phân bổ). Tôi đã đi qua một số tập tin nguồn và tiêu chuẩn, và tôi khá chắc chắn rằng các mẫu là std::basic_string<T, std::char_traits<T>, std::allocator<T>>, vì vậy tôi là một mất mát lý do tại sao tôi không nhìn thấy các tin nhắn từ chức năng phân bổ thay thế của tôi.

Có ai có thể làm sáng tỏ vấn đề này không? Tôi phải làm gì để theo dõi phân bổ chuỗi? Ngoài ra, bất cứ ai có thể chạy điều này thông qua một số trình biên dịch khác và xem nếu nó tạo ra bất kỳ đầu ra?

(Ví dụ: nếu tôi thêm std::map<int, int> m { { 0, 1 } };, tôi có đầu ra new() requests 24 bytes, allocated at 0x8d53028 vv)

+0

Hãy coi chừng tối ưu hóa bộ đệm nhỏ. –

+0

Cập nhật: Sự cố chỉ xuất hiện (trong GCC 4.6.1 và 4.4.3) nếu tôi biên dịch bằng '-fwhole-program'! –

+0

FWIW: Tôi nhận được đầu ra từ tùy chỉnh mới của bạn bằng cách sử dụng 64-bit g ++ 4.5.2, trong chế độ gỡ lỗi hoặc tối ưu hóa. –

Trả lời

4

Nhìn vào đầu ra của g++ ... -S có/không có -fwhole-program nó xuất hiện rằng toàn bộ tùy chỉnh mới/xóa các nhà khai thác không được phát ra ở tất cả các khi sử dụng fwhole-program.

Tôi bắt đầu nghi ngờ chúng tôi đang xem xét lỗi ở đây.

+0

Cảm ơn! Có lẽ tôi sẽ tập tin này như là một lỗi, và chúng ta có thể thấy nếu bất kỳ của các nhà phát triển có thể xác nhận điều này. –

+0

Thật kỳ lạ mặc dù với bất kỳ container nào khác, toán tử * không * được sử dụng! –

+0

Nó đang được giải quyết ngay trong báo cáo lỗi. Cảm ơn! –

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