您好我最近正在做一些阅读并决定尝试实现一个自定义操作符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!你好,世界!测试
编辑:尝试没有字符串类,现在它只执行一次。我假设下面有一些东西在延迟初始化时创建了两次。但是仍然希望得到一些澄清。
答案 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