2014-12-07 312 views
0

嗨,我最近正在做一些阅读,并决定尝试实现自定义运算符新,所以我可以登录到一个文本文件时分配内存和删除内存泄漏。C++自定义运算符新

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

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

#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

有可用于该工具,将让你的生活变得更加简单,并且更加健壮不是简单地提供定制'new'和'delete'运营商。花时间学习如何使用它们。 – 2014-12-07 04:44:30

+0

@CaptainObvlious这是我个人学习的目的 – 2014-12-07 04:45:24

+0

'new'被调用两次,因为它被称为一个来创建'string',然后再次创建缓冲区以保存字符串数据。 – 2014-12-07 04:47:40

回答

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