加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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足够的内存,并在标头偏移后返回正确的起始地址.
Deallocate从它获取的内存地址中减去标头偏移量并释放该内存
(如果他们有帮助我可以发布这些方法,它看起来似乎太多代码)

解决方法

new std::string()

这需要两个分配:一个用于std :: string对象,另一个用于其底层内存缓冲区.

如果你写的

std::string s;

你会看到它称之为新的一次.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读