2013-11-25 33 views
-1

中的指針的指針我創建了一個while語句,其中我將一個指針指向指向地圖的指針。 例子:在Visual Studio 2010中創建指向while語句問題

std::map<int,std::tuple<int,std::string>** > dmap; 
     int i=0; 
     while (i<3){ 

      std::tuple<int,std::string>* t = new std::tuple<int,std::string>(10+i,std::string("test")); 
      dmap[i] = &t; 
      dmap[i + 1 ] = &t; 
      i++; 
     } 
. 
. 
.  
for (auto it = d.begin();it!=d.end();++it) 
    { 
     if(*(it->second) != nullptr){ 
      delete *(it->second); 
      *(it->second) = nullptr; 
     } 


    } 

的問題是,&t地址總是一樣的,因此在地圖總是包含年底,我進入,最後*t值的所有鍵。

有什麼問題? (已解決)

[編輯] 現在我修改代碼之前它是不完整的,如果我想要避免刪除nullptr我需要有一個指針指針。或不?

+2

'dmap [i] = t;'而不是t,因爲t是一個局部變量,所以地址在循環中是一樣的。順便說一句,在這種情況下,比在這種情況下好一陣子,更容易 – Thomas

+0

你是對的,謝謝。 – user3032420

+0

問題是您沒有正確縮進您的代碼! –

回答

0

那麼,t的地址總是相同的,因爲它是存儲在堆棧上的局部變量。每當你進入該區塊時,t將被分配到同一個位置(因爲在你離開while正文後你正在銷燬t)。

相反,你需要在堆上分配它(如果這真的是你想要做的)。

std::tuple<int,std::string>** t = new std::tuple<int,std::string>*(); 
*t = new std::tuple<int,std::string>(10+i,std::string("test")); 
dmap[i] = t; 

我看不到你要完成什麼,但是這將是一個更好的解決方案:

std::map<int,std::tuple<int,std::string>* > dmap; 
    int i=0; 
    while (i<3){ 

     std::tuple<int,std::string>* t = new std::tuple<int,std::string>(10+i,std::string("test")); 
     dmap[i] = t; 
     i++; 
    } 

更妙的是使用智能指針來代替原之一。

更好的是按值存儲對象(根本沒有指針)。

3

問題是,您要將一個指向局部變量t的指針放入地圖中。每個循環後,t被銷燬,指針不再有效。

我不知道你爲什麼使用指針,更不用說指向指針的指針了。你可能希望把自己的元組在地圖:

std::map<int,std::tuple<int,std::string>> dmap; 
for (int i = 0; i<3; ++i){ 
    dmap[i] = {10+i, "test"}; 
} 
0

爲什麼您有興趣std::tuple<int,std::string>**

難道std::tuple<int,std::string>*就足夠了嗎?

std::map<int,std::tuple<int,std::string>* > dmap; 
    int i=0; 
    while (i<3){ 

     std::tuple<int,std::string>* t = new std::tuple<int,std::string>(10+i,std::string("test")); 
     dmap[i] = t; 
     i++; 
    } 
1

我創造,我分配一個指針指向一個地圖

對不起,我說這是一個while語句,但像你比的事實,更大的問題它的聲音,我噸是相同的(這看起來像xy problem)。

考慮(按順序),這些替代方法之一:

  • 店的元組的值

  • 店的元組由單一指針(不是「按價值」更糟的是,不是「通過指針更好指針「)。如果你能做到這一點,考慮宣佈你的地圖上std::shared_ptr<std::tuple<...>>

  • 如果你真的需要地圖指針的指針來元組,考慮創建就像一個智能指針在內部指針(和管理的最小代理對象以安全的方式爲你分配),並且像外部的常規類型(並相應地重新聲明你的地圖)。

無論哪種方式,如果你真的需要地圖指針的訪問指向元組(出於某種原因),分配應該這樣做:

std::map<int,std::tuple<int,std::string>**> dmap; 
int i=0; 
while (i<3) { 
    *dmap[ i ] = new std::tuple<int,std::string>{10 + i, "test"}; 
    ++i; 
} 

(該你做的添加方式地圖上的相同本地(堆棧)變量的地址,這會導致在您退出本地函數後出現未定義的行爲)。