2015-01-05 53 views
-1

我的代碼示例如下圖所示..插入字符*新入載體C++

std::vector<char*> vNameList;//it will be defined globally.. 



int main(int argc, char* argv[]) 
{ 
CollectName(); 
    for(int i = 0; i<(int)vNameList.size(); i++) 
    { 
    printf("\n %s" , vNameList[i]);//Here gabage values are getting printed on console 
    } 
    return 0; 
} 

void CollectName() 
{ 
    char *Name = new char[sizeof(NAME)+1];//NAME datatype is defined having size of 32 char 

    //processing for Name is performed , which includes assigning Name variable with value.. 

    //now insert it into vector 
    vNameList.push_back(Name); 

    delete[] Name; //at this Name value inserted into vector become garbage 
} 

我相信,如果我們初始化字符*新的必須被刪除,以避免內存泄漏。但是這導致修改矢量的值。

請指導我,以便我可以更正我的代碼,這會給我正確的值。

我有一些限制,只能使用Char *,所以建議使用char *來實現這一點。

+1

Depositphotos你的載像是空的。循環不應該運行。 – juanchopanza

+7

爲什麼要首先解決這個問題? 'std :: vector '會做得很好。 –

+0

在你的例子中,你在哪裏調用'CollectName'? – PiotrNycz

回答

1

你可以通過在之後刪除指針來糾正你的代碼(假設你實際上有使用指針的代碼,你的示例代碼根本不會打印任何東西,垃圾或其他)。

但是,通常將字符串存儲在std::string中,當您將std::string存儲在std::vector中時,不再需要手動管理內存。

1

這是因爲數組的名稱被視爲在c + +(或c,它是inherted)中的指針。

因此,當你做

vNameList.push_back(Name); 

,它把char *爲載體,即指向第一個字符(ANS因此字符串)向量,但你刪除的指針之後,因此你收到垃圾值。但是,如果您不刪除指針,它仍然可以正常工作,因爲指針仍然存在,但這樣您就不會釋放內存。因此:DONOT使用本

那就是:LIVE EXAMPLE

爲了避免這種麻煩:你應該使用

std::vector<std::string> vNameList; 

代替。

+0

「如果你不刪除指針,它工作得很好」 - 只要你找到另一種(可靠的)方法來修復泄漏。 –

+0

@MikeSeymour,哎呀忘了提及,謝​​謝 –

+0

@AbhishekGupta - 我檢查了它的調用刪除是被臆測的,但這會不會導致任何內存泄漏?我已經讀過,每當使用新的它應該刪除。 – user987316