2014-12-07 43 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