2010-06-14 76 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