2010-10-10 34 views
1

我在定義爲vector<pair<char *, int> > data;的類中有一個私有屬性。我通過data.push_back(make_pair(p, r));向此矢量添加數據。後來,當我從矢量中獲取數據時,我得到了p值的錯誤數據。返回的數據就像��U3。我認爲這是因爲指向char數組的指針正在被存儲。我將如何去存儲矢量中的實際副本。如果它有助於char數組永遠不會超過255個字符+ 1的空終止。C++在對的向量中存儲字符串的副本

+1

你能向我們展示如何分配添加到向量對中的字符串嗎? – 2010-10-10 07:26:25

回答

1

它看起來好像你有一個指向p(在當時定義的)放置在棧上的指針。一旦堆棧框架彈出,你仍然有指針,但它指向的內存可能是垃圾。這些搖晃的指針問題可能會讓人討厭,所以我建議使用#include <string>中定義的std :: string類來存儲字符串數據。

+0

不一定與堆棧有任何關係。 – Potatoswatter 2010-10-10 07:12:27

+0

@Potatoswatter:沒錯,沒有代碼我不能確定地說,但這只是猜測我認爲是可能的。 – shuttle87 2010-10-10 07:21:58

5

使用char*的任何真正原因?使用std::string,這會讓你的問題消失。

1

由於STL基於複製和值語義,因此如果整個字符串(不僅是指向它的指針)存儲在容器中(這裏是vector),則更容易。我說「更容易」,因爲可以將指針保存在STL容器中,但是指向的內存必須由用戶代碼管理。從這個問題看來,這似乎還沒有完成。

所以,也許你可以使用string代替char *,對於如:

typedef std::pair< std::string, int > MyPair; 
std::vector<MyPair> data; 
1

如果您有正在處理的裸指針一vector<pair<char *, int> >需要手動管理你的字符串的壽命。這是一個重大PITA和它很可能,你做錯了什麼(尤其如此,因爲你甚至沒有要求這樣做的權利,這似乎在暗示你甚至不知道你有做這個)。

與其他人一樣,我建議您改用vector<pair<std::string, int> >

1

你通過分配堆棧變量字符串,並保存它的地址是什麼?當您從您的分配函數返回這將導致您所描述的問題。

更好地分配在堆上(使用new運算符)的字符串,然後將其存儲在堆中分配的地址。例如

char* pNext = new char[50]; 
strcpy(pNext, ...); 
data.push_back(make_pair(pNext, r)); 

你必須用char數組完成所有你自己的工作 - 例如,你必須確保他們是空終止,或當你去打印出來你就會有意想不到的輸出結果。

例如

pNext[49] = '\0'; 

另外請記住,當你與一個堆分配字符串後,必須刪除它們。字符*的因而刪除:

delete [] pNext; 

正如其他人所說,還有其他的string實現,這將導致你少頭疼。

最容易使用的可能是CString,但會招致包括MFC的實現或ATL的實現它的開銷。 std :: string的,正如別人提到的是另一種選擇。

希望這有助於!

相關問題