2010-06-14 74 views
2

我在頭文件中定義的結構:C++向量和結構問題的win32

struct video 
{ 
wchar_t* videoName; 
std::vector<wchar_t*> audio; 
std::vector<wchar_t*> subs; 
}; 
struct ret 
{ 
std::vector<video*> videos; 
wchar_t* errMessage; 
}; 
struct params{ 
HWND form; 
wchar_t* cwd; 
wchar_t* disk; 
ret* returnData; 
}; 

當我嘗試我的視頻結構添加到視頻的載體*我可以訪問衝突讀取0xcdcdcdc1(videoName是@ 0xcdcdcdcd,在我分配它)

//extract of code where problem is 
video v; 
v.videoName = (wchar_t*)malloc((wcslen(line)+1)*sizeof(wchar_t)); 
wcscpy(v.videoName,line); 
p->returnData->videos.push_back(&v); //error here 
+0

你已經分配了'p-> returnData = new ret()'?無論如何,它看起來像你在棧上創建'v',然後在你的向量中存儲一個指向它的指針;不會超過當前函數,所以如果它返回到其他地方,您需要改爲'video * v = new video()'。 – Rup 2010-06-14 19:07:08

+2

指針太多。 :(你將'&v'傳遞給一個向量......將會超出範圍的東西的地址!你應該改變你的向量爲'std :: vector

+2

你可能需要'std :: wstring'作爲'wchar_t'指針的替換 – Amnon 2010-06-14 19:17:25

回答

3

我猜想,要麼pp->returnData是一個未初始化的/無效的指針。另外,這不會導致你的崩潰,但是一旦你解決了當前的問題:當心將指針返回給一個局部變量。一旦你的函數超出範圍,本地向量將被銷燬,&v將是一個無效的指針。如果你想讓你的向量超出當前函數的範圍,那麼你將需要在堆上分配它:

vector *v = new video(); 
... 
p->returnData->videos.push_back(v); 
+0

另外他補充說一個指向局部變量的指針,這也可能導致問題! – mmmmmmmm 2010-06-14 19:11:20

+1

真正的解決方案是將指針丟棄,沒有使用它們的目的,但創建額外的工作 – GManNickG 2010-06-14 19:14:25

+0

感謝p-> returnData =(ret *)malloc(sizeof( ret)); 是不是正確的做法,我做了一個新的ret(),它工作的很好 – user366597 2010-06-14 19:18:50