c ++自定义运算符new

时间:2014-12-07 04:39:50

标签: c++ memory new-operator

您好我最近正在做一些阅读并决定尝试实现一个自定义操作符new,所以我可以在分配和删除内存时查找文本文件以查找内存泄漏。

我遇到的一个问题是,当我重载新函数并在其中放置一个打印件时,该函数被调用两次。

我想知道这是否正确,如果是这样,为什么会这样?

#include <iostream>
#include <string>

void* operator new(size_t size)
{
    void* storage = malloc(size);
    std::cout << "Hello World! ";
    return storage;
}
int main()
{
    std::string *s = new std::string("test");
    std::cout << *s;
    return 0;
}

结果:

  

Hello World!你好,世界!测试

编辑:尝试没有字符串类,现在它只执行一次。我假设下面有一些东西在延迟初始化时创建了两次。但是仍然希望得到一些澄清。

1 个答案:

答案 0 :(得分:1)

std::string是一个在堆上分配内存以存储其数据的类。根据设计,这需要两次调用new,一次调用实际字符串类的存储,另一次调用char数组来存储文本。

#include <iostream>
#include <cstdlib>

void* operator new(std::size_t size)
{
    void* storage = malloc(size);
    std::cout << "Asked for: " << size
        << ", at: " << storage << std::endl;
    return storage;
}

struct A
{
    char * data;
    A() {data = new char[10];}
    ~A() {delete[] data;}
};


int main()
{
    A* ptr = new A;
    return 0;
}

输出:

Asked for: 8, at: 0x1f68010
Asked for: 10, at: 0x1f68030