2017-11-04 136 views
0

我想用其他對象的構造函數調用1對象的構造函數,並且在刪除東西時遇到問題。代碼的重要部分如下所示:將構造函數傳遞給函數C++而不調用delete

class command { 
public: 
    command(const string& s) { 
     x = (char*) calloc(s.size()+1, 1); 
     memcpy(x, s.c_str()); 
    } 
    ~command() { 
     free(x); 
    } 
private: 
    char* x; 
} 

此構造函數mallocs需要在析構函數中釋放的char *。

class pair { 
public: 
    pair(command comm1in, command comm2in) 
    :comm1(comm1in), comm2(comm2in){}; 
private: 
    command comm1; 
    command comm2; 
} 

這一嘗試的2場設置爲發送的命令。 我想這也要求他們的拷貝構造函數(可能是錯的)

在另一個函數

,我呼籲對構造像這樣

pair p(command("something"), command("something else")); 

不幸的是,這有號召剛剛創造的價值的析構函數,然後在構造函數中對拷貝構造函數的影響。

有沒有一種很好的方式來通過複製/刪除過程初始化comm1和comm2? 我認爲C++ 11有rValue引用和std :: move,但我不知道這些是否會在這裏發揮作用。

+7

如果你在C++中,不使用malloc,使用新的std :: string。 – Aganju

+4

@Aganju是否正確,但如果您需要管理自己的資源,請確保遵循[三/五/零]規則(http://en.cppreference.com/w/cpp/language/) rule_of_three)。 –

+0

爲什麼不在'command'的構造函數和析構函數中設置一個斷點?然後,您可以記下每種情況下正在創建和銷燬的對象的地址,並查看它們是否匹配,以及每次調用的次數。這可能會讓你對發生的事情有所瞭解。 – user1118321

回答

-5

所以我問了我的一位教授,然後玩了一下。 This非常有幫助。

這是上面的代碼應該看起來像,如果我們要避免雙釋放指針x。 命令:

class command { 
public: 
    command(const string& s) { 
     x = (char*) calloc(s.size()+1, 1); 
     strcpy(x, s.c_str()); 
    } 
    command(command&& in): x(in.x) { 
     other.x = nullptr; 
    } 
    ~command() { 
     if(x) delete x; 
    } 
private: 
    char* x; 
} 

對:

class pair { 
public: 
    pair(command&& comm1in, command&& comm2in) 
    :comm1(std::move(comm1in)), comm2(std::move(comm2in)){}; 
private: 
    command comm1; 
    command comm2; 
} 

呼籲對的構造看起來是一樣的

pair(command("something"), command("something else")); 

學習:

調用delete構造是不可避免的,所以我們反而必須定義一個移動構造函數給它的Rv命令alue的指針,並將R值的指針設置爲null。 (所以當它的析構函數被調用時不釋放仍然指向的內存)

爲了讓物體移動到另一個物體,用的std ::移動()

爲什麼這樣做初始化它們?

  • 這允許我們確保只有那一個命令實例纔會有對象。
  • 我們不必malloc /調用new並在堆上獲取空間。
  • 時,對被刪除的命令被自動刪除,所以我們沒有寫一個刪除功能
相關問題