簡體   English   中英

刪除一個指針作為std :: map的第一個鍵

[英]Delete a pointer as first key of std::map

我想知道如何正確刪除一個指針,它是std::map的第一個鍵。 我只能為第二把鑰匙弄清楚。 第一個密鑰僅可讀。

例:

std::map<char*,foo> myMap;
char* str = new char[3];
foo bar;
str[0]='h';
str[1]='i';
str[2]='\0';
myMap[str] = bar

/* some code */
for(auto element: myMap)
{
    delete [] element.first;
}

這似乎沒有釋放指針。 std::map是否在某個地方丟失了指針? 我正在處理大數據,因此我需要盡可能輕的字符串結構。 這就是為什么我使用char*而不是std::string (將比較器函子提供給映射)的原因。

編輯

更高的精度:

  • 我正在讀取ADN序列。 對於我正在閱讀的每個模式,我都將其位置放置在地圖中。(std :: map>)
  • 我正在使用char *,因為std :: string分配的字符數超過了所需的字符數
  • 我的優先級不是計算時間,而是內存空間。

希望這可以幫助您理解我的問題。

您的代碼已經可以工作了(但也不是異常安全的-可以使用智能指針)。 請注意,當內存為delete d時,程序通常不會浪費時間來更改它,它只是更改一些空閑/使用中的記錄,以便將來的分配可以考慮將該內存重用,因此,如果嘗試取消引用delete d指針您有未定義的行為,但它似乎仍然具有舊內容-至少有一段時間。 我認為這就是為什么您認為解除分配不起作用的原因。

您的地圖有兩個元素,您需要刪除第一個元素: it->firstchar*it->secondfoo 嘗試以下代碼:

for(std::map<char*, foo>::iterator it = myMap.begin(); it!=myMap.end(); it++)
{
     delete[] it->first;
     myMap.erase(it);
}

希望有幫助!

解決

謝謝大家,您的意見有助於解決我的問題。 我成功使用了std :: string。 我知道,我告訴過你那太重了。 但是我發現了méthod 儲備(size_t n = 0) ,它完全可以容納我們想要的地方。 現在,不再有泄漏。

再次感謝您的回答!

資料來源: http : //www.cplusplus.com/reference/string/string/reserve/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM