结构体中的vector, 怎么定义,怎么使用?

notlookback 2009-05-06 11:48:13
我想实现动态定义数组,所以我用vector
typedef struct{
unsigned short pt[100];
}USHORT1D;
typedef struct{
USHORT1D line[200];
}USHORT2D;
typedef struct{
    vector<PLANE_OF_USHORT> zz;
}INFO;

INFO* inf;

void aaa(void* buffer){

USHORT2D *tmp = (USHORT2D*)malloc(sizeof(USHORT2D));
memcpy( tmp, buffer, sizeof(USHORT2D));
planes__->zz.push_back(*tmp);//为什么每次到这里都有问题,是不是vector用法错误??到底该怎么

}

int main(){

inf=(INFO*)malloc(sizeof(INFO));
do{
...获得 buffer,方法省略
aaa(buffer);
}while(blabla);

return 0;
}

谢谢大侠帮我看看
...全文
1445 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
shudiansheji 2011-08-12
  • 打赏
  • 举报
回复
学习了
chinacoding 2009-05-08
  • 打赏
  • 举报
回复
这时候个内存访问越界问题
在自己查查你的程序
chinacoding 2009-05-08
  • 打赏
  • 举报
回复
就是push_back
notlookback 2009-05-07
  • 打赏
  • 举报
回复
没人知道么?
notlookback 2009-05-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chinacoding 的回复:]
使用push的方法不用resize,他会自动给你resize的
你这个必须使用指针,你的结构体太大
USHORT2D *tmp = (USHORT2D*)malloc(sizeof(USHORT2D));
在调用aa后是不会失效的,
因为你malloc生成的空间在堆上

如果下定义会失效

typedef struct AA TT

int aa(buffer)
{
TT var;
vectorList.push(&var); // 注意这里的var生命周期是aa,aa已结束 指向他的地址就是个野地址,因为var分配在栈上

TT* var = (TT*)m…
[/Quote]



哦,刚刚发了个新帖子问这个问题,没想到你在这儿给了个解释,谢谢

不过,这个push方法,是哪儿的?好像vector只有push_back吧?我用指针的方式,仍然不行, 还是有'System.AccessViolationException'的问题呢?
chinacoding 2009-05-07
  • 打赏
  • 举报
回复
使用push的方法不用resize,他会自动给你resize的
你这个必须使用指针,你的结构体太大
USHORT2D *tmp = (USHORT2D*)malloc(sizeof(USHORT2D));
在调用aa后是不会失效的,
因为你malloc生成的空间在堆上

如果下定义会失效

typedef struct AA TT

int aa(buffer)
{
TT var;
vectorList.push(&var); // 注意这里的var生命周期是aa,aa已结束 指向他的地址就是个野地址,因为var分配在栈上

TT* var = (TT*)malloc(sizeof(TT)); // malloc和c++中的new功能一样,唯一不同的是没有给内存初始化
vectorList.push(var); // 这样保存指针就可以,因为var指向的内存在堆上分配,除非你主动释放,否则一直保留到程序结束
}

问题出在你对内存的管理机制还是不太了解。
想你这种大体积的结构体,我一般都是用指针存放。
否则栈肯定被撑爆

栈空间是在程序编译的时候就规定好的。一般会预留一定空间(但不是很大)
如果一个量的体积是位置的,只有在程序运行的时候才能知道,如果体积不大可以按照你说的做。栈上预留的空间一般够用。
但是体积超大,就是你这种情况,只能在堆上做文章,对用用来在程序运行时动态派生空间的。

再有一种就是静态变量区,这种按照本质上讲和栈没有区别。

chinacoding 2009-05-07
  • 打赏
  • 举报
回复
说白了 你的vector中本身存的就是变量型,为什么还要malloc呢?多此一举不是么
push_back存的不是你分配的内存,而是你分配内存中内容的一份拷贝
而且你还没有释放它
chinacoding 2009-05-07
  • 打赏
  • 举报
回复
看了你的程序,但是不想改动你的程序。
vector用法如下
typedef struct
{
int a;
int b;
}AA;

typedef std::vector<AA> AAListType;

int main()
{
AAListType aaArray;
AA aa;
aaArray.push_back(aa);
}

对于你的程序没有必要做malloc,因为你存的是变量的本身,stl会做拷贝的
一般在存储指针的情况下采用malloc/new
比如

typedef std::vector<AA*> AAListType;

int main()
{
AAListType aaArray;
AA* aa = (AA*)malloc(sizeof(AA));
aaArray.push_back(aa);
}

如果把上面的改成下面
int main()
{
AAListType aaArray;
AA aa; // = (AA*)malloc(sizeof(AA));
aaArray.push_back(&aa); // 注意如果离开main函数,以后将无法读取这个aa,因为它的生命周期已经结束,内存已经释放,指针将是无效指针。
}


对于你的程序我的提议是 由于结构体比较大,推荐采用存储指针的方式,不需要多2次拷贝,耗资源不说还影响效率。
我觉得我说的已经够详细了

notlookback 2009-05-07
  • 打赏
  • 举报
回复
是不是结构体太大了,栈溢出??我把stack reserve size改大了1000000,是不是还不够,这次错误是运行到“planes__->zz.push_back(tmp);“,显示错误:System.AccessViolationException

我实在是半吊子都不够,搞不懂,谁来帮忙救命啊!!!
十八道胡同 2009-05-07
  • 打赏
  • 举报
回复
up
notlookback 2009-05-07
  • 打赏
  • 举报
回复
而且我不能用指针,我不可以让tmp每次都在aaa(buffer)调用完后就失效了,那样inf不就没有内容了吗?
notlookback 2009-05-07
  • 打赏
  • 举报
回复
谢谢楼上的指教,可是我的问题还有点麻烦,因为如果我在程序中不用malloc,直接
typedef struct{
unsigned short pt[100];
}USHORT1D;
typedef struct{
USHORT1D line[200];
}USHORT2D;
typedef struct{
    vector <USHORT2D> zz;
}INFO;

INFO* inf;

void aaa(void* buffer){

USHORT2D tmp;//程序运行到这里就会出错,说是"An unhandled exception of type 'System.StackOverflowException' occurred";
memcpy( &tmp, buffer, sizeof(USHORT2D));
planes__->zz.push_back(tmp);


}

int main(){

inf=(INFO*)malloc(sizeof(INFO));
do{
...获得 buffer,方法省略
aaa(buffer);
}while(blabla);

return 0;
}


7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧