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)
Hãy coi chừng tối ưu hóa bộ đệm nhỏ. –
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'! –
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. –