c – 动态创建std :: string时的两个“新”调用
发布时间:2020-12-16 10:08:23 所属栏目:百科 来源:网络整理
导读:我正在尝试创建一个简单的内存管理器来熟悉这个概念,我已经为全局new和delete提供了覆盖,并且刚开始搞乱构造一些对象,当我注意到单个动态字符串分配时,我似乎打了两次新的.第一次new被命中,它甚至在字符串构造函数被调用之前,奇怪的是,这是两个分配中较大的
我正在尝试创建一个简单的内存管理器来熟悉这个概念,我已经为全局new和delete提供了覆盖,并且刚开始搞乱构造一些对象,当我注意到单个动态字符串分配时,我似乎打了两次新的.第一次new被命中,它甚至在字符串构造函数被调用之前,奇怪的是,这是两个分配中较大的一个,第二次被命中时,调用来自std :: string(basic_string)构造函数.
我想知道两个新的是什么.具体来说,我在这种情况下关心它,因为每个新的都创建了自己的分配标题,如果我使用一个简单的内存管理器,我会对我将要介绍的开销产生学术上的好奇心. 相关代码: class DumbDataType { std::string m_name; }; int main() { printf("STARTING MEMORY MANAGEMENT TESTING n"); printf("******************* Creating DATA ******************* n"); std::string* data = new std::string(); delete data; printf("******************* Creating LORE ******************* n"); DumbDataType * lore = new DumbDataType(); delete lore; getchar(); } 运行时输出 STARTING MEMORY MANAGEMENT TESTING ******************* Creating DATA ******************* [New] 28 [New] 8 [Delete] 00D88C18 [Delete] 00D88BC8 ******************* Creating LORE ******************* [New] 28 [New] 8 [Delete] 00D88C18 [Delete] 00D88BC8 操作符新增和删除 void * operator new(std::size_t size,MemoryManagement::Heap* heap) { assert(heap != nullptr); assert(size > 0); return heap->Allocate(size); } void * operator new(std::size_t size) { printf("[New] %i n",size); return operator new (size,MemoryManagement::HeapFactory::GetDefaultHeap()); } void operator delete (void * memoryLocation) { if (memoryLocation != NULL) { printf("[Delete] %p n",memoryLocation); MemoryManagement::Heap::Deallocate(memoryLocation); } } ‘GetDefaultHeap’方法只获取静态分配的堆数组中的第一个元素. 为大小和标题分配mallocs足够的内存,并在标头偏移后返回正确的起始地址. 解决方法new std::string() 这需要两个分配:一个用于std :: string对象,另一个用于其底层内存缓冲区. 如果你写的 std::string s; 你会看到它称之为新的一次. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |