2012-04-06 91 views
0

我想動態分配一個新的對象。C++內存分配新[]和刪除[]

int len = (nm == NULL) ? 0 : strlen(nm); 

try { 
    name = new char[len + 1]; 
} 
catch(std::bad_alloc) { 
    name = NULL; 
} 
if(name) { 
    if(nm == NULL) 
     strcpy(name, ""); 
    else 
    { 
     strcpy(name, nm); 
     cmds=new command [num_of_cmds]; 

然後我的析構函數已經被他們通過

robot::~robot() 
{ 
if (name) { 
    delete[] name; 
} 
delete [] cmds; 
} 

我不斷收到segementation故障,如果我修改一些代碼,在一個簡單的INT初始化值刪除,它打破。我的刪除[] CMD中斷,所以我必須評論它。任何幫助將不勝感激。如果人們需要,我會澄清更多的事情。

+2

發表一個小的自編可以演示你的問題的例子。注意看你的代碼,有很多東西需要改進。而且,這個例子甚至不會編譯,我懷疑這是*代碼不是*原始*代碼。 – 2012-04-06 07:25:31

+0

我很確定我看到這個代碼兩天前.. http://stackoverflow.com/questions/10001614/c-vector-arrays-in-copy-constructors – 2012-04-06 07:27:28

+1

@amit:雖然代碼是完全災難性的,我不看不到'cmds'在任何地方被聲明。我只看到它被分配,並不知道它是否是成員。 – 2012-04-06 07:28:54

回答

1

當您的機器人的名稱爲NULL(nm == NULL)時,您分配一個空字符串,但不要分配cmds。所以你至少應該在該分支中將cmds設置爲NULL,或者在delete [] cmds;之前檢查析構函數if (name && *name != 0)。我用的第一個選項去...

0

除非你有一個非常理由不,你應該避免使用new[]delete[],而使用std::stringstd::vector。這些處理你的內存管理;並因此而使用起來相當容易。

std::vector比手動分配的緩衝區更有用,不僅因爲它爲您處理內存,而且它仍然與舊的C風格API兼容。在需要提供const char *char *的情況下,您可以簡單地提供&vec[0](如std::vector的第一個元素的地址)。

std::string使內存管理,字符串處理,和(與std::stringstream一起)字符串格式化很多很多,容易。不要試圖自己處理內存管理,請使用經過良好測試的std::stringstd::vector