57 个解决方案
#1
什么错
#2
是不是这结构面有拷贝构造函数 和赋值操作符 不正确类成员.
#3
mark
#4
贴出代码来看看。
vector的push_back对对象的大小没有要求的。
有要求的是对象需要提供拷贝构造函数和与之相关的函数操作。
vector的push_back对对象的大小没有要求的。
有要求的是对象需要提供拷贝构造函数和与之相关的函数操作。
#5
up
#6
老大你压指针嘛。效率高。
#7
typedef struct MsndSMovieShowTimes_
{
int nMovieId;
mxUINT8 nNumberOfShows;
MsndCommonTime aTimes[MAX_SHOW_TIMES];
} MsndSMovieShowTimes;
typedef struct MsndMovieGPS_
{
mxFLOAT64 nLatitude;
mxFLOAT64 nLongitude;
} MsndMovieGPS;
typedef struct MsndSTheater_
{
MsndMovieGPS Location;
TCHAR strTheaterName[MSND_MOVIES_THEATER_NAME_LENGTH];
TCHAR strPhone[MSND_MOVIES_THEATER_PHONE_LENGTH];
TCHAR strAddress[MSND_MOVIES_THEATER_ADDRESS_LENGTH];
MsndSMovieShowTimes aShowTimes[MAX_MOVIES_PER_THEATER];
mxINT32 nNumberOfMovieShowTimes;
mxFLOAT64 Distance;
} MsndSTheater;
就是MsndSTheater,比较大哈,在PC上跑完全没事,但是在设备上跑就出问题了。
{
int nMovieId;
mxUINT8 nNumberOfShows;
MsndCommonTime aTimes[MAX_SHOW_TIMES];
} MsndSMovieShowTimes;
typedef struct MsndMovieGPS_
{
mxFLOAT64 nLatitude;
mxFLOAT64 nLongitude;
} MsndMovieGPS;
typedef struct MsndSTheater_
{
MsndMovieGPS Location;
TCHAR strTheaterName[MSND_MOVIES_THEATER_NAME_LENGTH];
TCHAR strPhone[MSND_MOVIES_THEATER_PHONE_LENGTH];
TCHAR strAddress[MSND_MOVIES_THEATER_ADDRESS_LENGTH];
MsndSMovieShowTimes aShowTimes[MAX_MOVIES_PER_THEATER];
mxINT32 nNumberOfMovieShowTimes;
mxFLOAT64 Distance;
} MsndSTheater;
就是MsndSTheater,比较大哈,在PC上跑完全没事,但是在设备上跑就出问题了。
#8
你的方法很好,我已经按照你的方法解决了,但是现在就是想弄清楚问题的存在,毕竟以后还有很多地方都需要用到,谢谢你。
#9
我就搞不懂,如果真如你所说,为什么PC上就可以正常的跑呢?谢谢了.......
#10
PC和设备的区别可能在于栈大小的问题,
操作系统间可能有区别
操作系统间可能有区别
#11
如果内存有限的话
push_back的时候可能会失败的说。
push_back的时候保存的是类的副本,需要新申请内存的说。。
不知道说得对不对,有大虾出来赐教一二
push_back的时候可能会失败的说。
push_back的时候保存的是类的副本,需要新申请内存的说。。
不知道说得对不对,有大虾出来赐教一二
#12
应该不是内存用完的原因哈(因为改成压指针就可以了,同样要用new来申请内存啊,跟直接压有什么区别呢?),怎么回事呢?难道push_back是分配到栈里面的?绝对不可能吧,因此我才提出是不是对压入的大小有限制或是其它某些问题,望大家都来说说啊,特别是高手,因为这个在应用中太重要了........
#13
一个指针才4byte阿
#14
你这样测试一下看看。
把你push_back的部分,修改成
声明两个MsndSTheater;对象,测试一下。
MsndSTheater a1;
MsndSTheater a2;
根据你的描述,应该也会出问题。
把你push_back的部分,修改成
声明两个MsndSTheater;对象,测试一下。
MsndSTheater a1;
MsndSTheater a2;
根据你的描述,应该也会出问题。
#15
MARK
#16
我知道,我的意思是说,push_back同样是动态分配的,而new也是动态分配的内存,为什么new的就行,而push_back就不行呢?难道他们分配空间的地方有区别,一个在栈?一个在堆里?
#17
同样的效果
#18
高手来说说吧,等着呢
#19
栈溢出!
windows是默认1M。嵌入系统一般栈默认就8~64K,甚至1K的都有。
你一下子搞一个50K的局部变量,当然就挂了。
windows是默认1M。嵌入系统一般栈默认就8~64K,甚至1K的都有。
你一下子搞一个50K的局部变量,当然就挂了。
#20
压对象的话,vector需要连续的内存空间,可能设备上找不到那么大一块连续内存。
但是压指针的话,指针指向的对象就可以随意分布在内存中了。
也有可能是这个原因
但是压指针的话,指针指向的对象就可以随意分布在内存中了。
也有可能是这个原因
#21
我是说压很多个对象的时候
#22
push_back压入的不是栈而是堆。
#23
那么这个栈的大小应该可以改变吧?我用的是vs2005,我改了还是一样的,这个栈的大小默认的会不会跟内存的大小有关系呢?
难道如楼上几位所说,应该是vector压入的时候要求要连续分配空间,所以造成死机了?也就是说vector的push_back压入的是分配在连续的空间里面的?
#24
upup
#25
是在连续内存上存储的。vector是顺序存储结构。
#26
但是现在我改成静态数组了,居然没问题了,同样还是连续分配空间的啊。
#27
mark, 支持一下, 高手请出招!
#28
静态数据不在栈上
#29
问问题不能浪费别人时间.
#30
study
#31
栈上50K。。
不知道你用的设备是不是指MOBILE设备?
如果是的话,差不多就是栈溢出了~
(LZ你用的设备,SDK等最好说明一下~)
建议那一段push_back的代码拉出来看看~(因为你上面说即使分割开依然出错?)
symbian设备上默认的栈一般是8K,最大栈为80K,默认堆4K-1M。
可以通过设置EPOCSTACKSIZE和EPOCHEAPSIZE来进行修改的。
wm的话就是58K(记得是这样)
其他的平台我并不熟悉,请达人补充~
其实这都需要看具体设备,WM还比较统一,symbian的话就看厂商心情了(一般都至少支持默认的大小)。
另外STL在MOBILE设备上一般不作为首选,其拷贝赋值的做法效率是比较低的~
PS: LS某位说用指针~ 是值得推荐的做法~
不知道你用的设备是不是指MOBILE设备?
如果是的话,差不多就是栈溢出了~
(LZ你用的设备,SDK等最好说明一下~)
建议那一段push_back的代码拉出来看看~(因为你上面说即使分割开依然出错?)
symbian设备上默认的栈一般是8K,最大栈为80K,默认堆4K-1M。
可以通过设置EPOCSTACKSIZE和EPOCHEAPSIZE来进行修改的。
wm的话就是58K(记得是这样)
其他的平台我并不熟悉,请达人补充~
其实这都需要看具体设备,WM还比较统一,symbian的话就看厂商心情了(一般都至少支持默认的大小)。
另外STL在MOBILE设备上一般不作为首选,其拷贝赋值的做法效率是比较低的~
PS: LS某位说用指针~ 是值得推荐的做法~
#32
确实应该压指针
然后就是注意你的类要实现拷贝构造和赋值
楼主是出错在哪里,压入的数据不完整还是怎样?
然后就是注意你的类要实现拷贝构造和赋值
楼主是出错在哪里,压入的数据不完整还是怎样?
#33
typedef struct MsndSMovieShowTimes_
{
int nMovieId;
mxUINT8 nNumberOfShows;
MsndCommonTime aTimes[MAX_SHOW_TIMES];
} MsndSMovieShowTimes;
typedef struct MsndMovieGPS_
{
mxFLOAT64 nLatitude;
mxFLOAT64 nLongitude;
} MsndMovieGPS;
typedef struct MsndSTheater_
{
MsndMovieGPS Location;
TCHAR strTheaterName[MSND_MOVIES_THEATER_NAME_LENGTH];
TCHAR strPhone[MSND_MOVIES_THEATER_PHONE_LENGTH];
TCHAR strAddress[MSND_MOVIES_THEATER_ADDRESS_LENGTH];
MsndSMovieShowTimes aShowTimes[MAX_MOVIES_PER_THEATER];
mxINT32 nNumberOfMovieShowTimes;
mxFLOAT64 Distance;
} MsndSTheater;
#define MsndSTheaters std::vector<MsndSTheater *>
MsndSMovies m_mDataMovie
在函数中定义一个MsndSTheater,赋值后采用MsndSTheaters.push_back(mDataMovie)就出错哈。改成静态数组或这压指针就正常了。
我用的是wence5.0系统,内存是128M的,不知道原因了啊
{
int nMovieId;
mxUINT8 nNumberOfShows;
MsndCommonTime aTimes[MAX_SHOW_TIMES];
} MsndSMovieShowTimes;
typedef struct MsndMovieGPS_
{
mxFLOAT64 nLatitude;
mxFLOAT64 nLongitude;
} MsndMovieGPS;
typedef struct MsndSTheater_
{
MsndMovieGPS Location;
TCHAR strTheaterName[MSND_MOVIES_THEATER_NAME_LENGTH];
TCHAR strPhone[MSND_MOVIES_THEATER_PHONE_LENGTH];
TCHAR strAddress[MSND_MOVIES_THEATER_ADDRESS_LENGTH];
MsndSMovieShowTimes aShowTimes[MAX_MOVIES_PER_THEATER];
mxINT32 nNumberOfMovieShowTimes;
mxFLOAT64 Distance;
} MsndSTheater;
#define MsndSTheaters std::vector<MsndSTheater *>
MsndSMovies m_mDataMovie
在函数中定义一个MsndSTheater,赋值后采用MsndSTheaters.push_back(mDataMovie)就出错哈。改成静态数组或这压指针就正常了。
我用的是wence5.0系统,内存是128M的,不知道原因了啊
#34
最大的可能就是你的复制函数的没有实现,是用编译器默认的所以就错了。对于简单的内型编译器还能应付,
对视本事对象型或是指针的出错可能性很大。
#35
对视本事对象型或是指针的出错可能性很大。
===========
对于复杂对象和指针出错的可能性很大。
===========
对于复杂对象和指针出错的可能性很大。
#36
你们的意思就是说,如果定义的结构体太过于复杂,就不能采用vector来直接存放了,只能通过压指针的方式了?但是WinCE系统好像没有内存管理机制,最好不要用new来动态分配内存的啊?不知道我说的对不对哈,请指教。
#37
mark
#38
不是,我的意思是指结构体里面有自定义对象,而这个自定义对象里面有其他对象指针,但是有没有写赋值构造函数函数,出错是一定的。对于pod不会错误。
#39
这个是个好的方法,
减少拷贝,时间空间,都是一大节约。
#40
这个讨论不错,mark 先
#41
mark
#42
mark
#43
LZ压指针好一些啊,效率高啊
#44
老大你压指针嘛
-----------
弱问一声:压指针怎么用?和直接push_back()有什么不一样,哪位高人举例说明一下?
-----------
弱问一声:压指针怎么用?和直接push_back()有什么不一样,哪位高人举例说明一下?
#45
直接压需要调用元素的拷贝构造函数,因此元素越复杂,效率就越低。压指针就没有这个问题,可以大大提高效率。
#46
64byte 栈的路过。
#47
最好别压大的对象,用指针替换,效率高。。不过我还是觉得压大对象不会出错,是你代码问题。
#48
同意!严重同意的说。
#49
我本来改成了压指针的,但是现在又让我改成静态数组了。老大说不让压指针,说是wince下系统自己没有内存管理机制,说容易造成内存碎片,不知道有没有这个问题存在?
#50
你老大是谁?vector内存是由stl管理的,本身就是为了解决内存碎片问题而设计的内存池。唉,你老大!
#1
什么错
#2
是不是这结构面有拷贝构造函数 和赋值操作符 不正确类成员.
#3
mark
#4
贴出代码来看看。
vector的push_back对对象的大小没有要求的。
有要求的是对象需要提供拷贝构造函数和与之相关的函数操作。
vector的push_back对对象的大小没有要求的。
有要求的是对象需要提供拷贝构造函数和与之相关的函数操作。
#5
up
#6
老大你压指针嘛。效率高。
#7
typedef struct MsndSMovieShowTimes_
{
int nMovieId;
mxUINT8 nNumberOfShows;
MsndCommonTime aTimes[MAX_SHOW_TIMES];
} MsndSMovieShowTimes;
typedef struct MsndMovieGPS_
{
mxFLOAT64 nLatitude;
mxFLOAT64 nLongitude;
} MsndMovieGPS;
typedef struct MsndSTheater_
{
MsndMovieGPS Location;
TCHAR strTheaterName[MSND_MOVIES_THEATER_NAME_LENGTH];
TCHAR strPhone[MSND_MOVIES_THEATER_PHONE_LENGTH];
TCHAR strAddress[MSND_MOVIES_THEATER_ADDRESS_LENGTH];
MsndSMovieShowTimes aShowTimes[MAX_MOVIES_PER_THEATER];
mxINT32 nNumberOfMovieShowTimes;
mxFLOAT64 Distance;
} MsndSTheater;
就是MsndSTheater,比较大哈,在PC上跑完全没事,但是在设备上跑就出问题了。
{
int nMovieId;
mxUINT8 nNumberOfShows;
MsndCommonTime aTimes[MAX_SHOW_TIMES];
} MsndSMovieShowTimes;
typedef struct MsndMovieGPS_
{
mxFLOAT64 nLatitude;
mxFLOAT64 nLongitude;
} MsndMovieGPS;
typedef struct MsndSTheater_
{
MsndMovieGPS Location;
TCHAR strTheaterName[MSND_MOVIES_THEATER_NAME_LENGTH];
TCHAR strPhone[MSND_MOVIES_THEATER_PHONE_LENGTH];
TCHAR strAddress[MSND_MOVIES_THEATER_ADDRESS_LENGTH];
MsndSMovieShowTimes aShowTimes[MAX_MOVIES_PER_THEATER];
mxINT32 nNumberOfMovieShowTimes;
mxFLOAT64 Distance;
} MsndSTheater;
就是MsndSTheater,比较大哈,在PC上跑完全没事,但是在设备上跑就出问题了。
#8
你的方法很好,我已经按照你的方法解决了,但是现在就是想弄清楚问题的存在,毕竟以后还有很多地方都需要用到,谢谢你。
#9
我就搞不懂,如果真如你所说,为什么PC上就可以正常的跑呢?谢谢了.......
#10
PC和设备的区别可能在于栈大小的问题,
操作系统间可能有区别
操作系统间可能有区别
#11
如果内存有限的话
push_back的时候可能会失败的说。
push_back的时候保存的是类的副本,需要新申请内存的说。。
不知道说得对不对,有大虾出来赐教一二
push_back的时候可能会失败的说。
push_back的时候保存的是类的副本,需要新申请内存的说。。
不知道说得对不对,有大虾出来赐教一二
#12
应该不是内存用完的原因哈(因为改成压指针就可以了,同样要用new来申请内存啊,跟直接压有什么区别呢?),怎么回事呢?难道push_back是分配到栈里面的?绝对不可能吧,因此我才提出是不是对压入的大小有限制或是其它某些问题,望大家都来说说啊,特别是高手,因为这个在应用中太重要了........
#13
一个指针才4byte阿
#14
你这样测试一下看看。
把你push_back的部分,修改成
声明两个MsndSTheater;对象,测试一下。
MsndSTheater a1;
MsndSTheater a2;
根据你的描述,应该也会出问题。
把你push_back的部分,修改成
声明两个MsndSTheater;对象,测试一下。
MsndSTheater a1;
MsndSTheater a2;
根据你的描述,应该也会出问题。
#15
MARK
#16
我知道,我的意思是说,push_back同样是动态分配的,而new也是动态分配的内存,为什么new的就行,而push_back就不行呢?难道他们分配空间的地方有区别,一个在栈?一个在堆里?
#17
同样的效果
#18
高手来说说吧,等着呢
#19
栈溢出!
windows是默认1M。嵌入系统一般栈默认就8~64K,甚至1K的都有。
你一下子搞一个50K的局部变量,当然就挂了。
windows是默认1M。嵌入系统一般栈默认就8~64K,甚至1K的都有。
你一下子搞一个50K的局部变量,当然就挂了。
#20
压对象的话,vector需要连续的内存空间,可能设备上找不到那么大一块连续内存。
但是压指针的话,指针指向的对象就可以随意分布在内存中了。
也有可能是这个原因
但是压指针的话,指针指向的对象就可以随意分布在内存中了。
也有可能是这个原因
#21
我是说压很多个对象的时候
#22
push_back压入的不是栈而是堆。
#23
那么这个栈的大小应该可以改变吧?我用的是vs2005,我改了还是一样的,这个栈的大小默认的会不会跟内存的大小有关系呢?
难道如楼上几位所说,应该是vector压入的时候要求要连续分配空间,所以造成死机了?也就是说vector的push_back压入的是分配在连续的空间里面的?
#24
upup
#25
是在连续内存上存储的。vector是顺序存储结构。
#26
但是现在我改成静态数组了,居然没问题了,同样还是连续分配空间的啊。
#27
mark, 支持一下, 高手请出招!
#28
静态数据不在栈上
#29
问问题不能浪费别人时间.
#30
study
#31
栈上50K。。
不知道你用的设备是不是指MOBILE设备?
如果是的话,差不多就是栈溢出了~
(LZ你用的设备,SDK等最好说明一下~)
建议那一段push_back的代码拉出来看看~(因为你上面说即使分割开依然出错?)
symbian设备上默认的栈一般是8K,最大栈为80K,默认堆4K-1M。
可以通过设置EPOCSTACKSIZE和EPOCHEAPSIZE来进行修改的。
wm的话就是58K(记得是这样)
其他的平台我并不熟悉,请达人补充~
其实这都需要看具体设备,WM还比较统一,symbian的话就看厂商心情了(一般都至少支持默认的大小)。
另外STL在MOBILE设备上一般不作为首选,其拷贝赋值的做法效率是比较低的~
PS: LS某位说用指针~ 是值得推荐的做法~
不知道你用的设备是不是指MOBILE设备?
如果是的话,差不多就是栈溢出了~
(LZ你用的设备,SDK等最好说明一下~)
建议那一段push_back的代码拉出来看看~(因为你上面说即使分割开依然出错?)
symbian设备上默认的栈一般是8K,最大栈为80K,默认堆4K-1M。
可以通过设置EPOCSTACKSIZE和EPOCHEAPSIZE来进行修改的。
wm的话就是58K(记得是这样)
其他的平台我并不熟悉,请达人补充~
其实这都需要看具体设备,WM还比较统一,symbian的话就看厂商心情了(一般都至少支持默认的大小)。
另外STL在MOBILE设备上一般不作为首选,其拷贝赋值的做法效率是比较低的~
PS: LS某位说用指针~ 是值得推荐的做法~
#32
确实应该压指针
然后就是注意你的类要实现拷贝构造和赋值
楼主是出错在哪里,压入的数据不完整还是怎样?
然后就是注意你的类要实现拷贝构造和赋值
楼主是出错在哪里,压入的数据不完整还是怎样?
#33
typedef struct MsndSMovieShowTimes_
{
int nMovieId;
mxUINT8 nNumberOfShows;
MsndCommonTime aTimes[MAX_SHOW_TIMES];
} MsndSMovieShowTimes;
typedef struct MsndMovieGPS_
{
mxFLOAT64 nLatitude;
mxFLOAT64 nLongitude;
} MsndMovieGPS;
typedef struct MsndSTheater_
{
MsndMovieGPS Location;
TCHAR strTheaterName[MSND_MOVIES_THEATER_NAME_LENGTH];
TCHAR strPhone[MSND_MOVIES_THEATER_PHONE_LENGTH];
TCHAR strAddress[MSND_MOVIES_THEATER_ADDRESS_LENGTH];
MsndSMovieShowTimes aShowTimes[MAX_MOVIES_PER_THEATER];
mxINT32 nNumberOfMovieShowTimes;
mxFLOAT64 Distance;
} MsndSTheater;
#define MsndSTheaters std::vector<MsndSTheater *>
MsndSMovies m_mDataMovie
在函数中定义一个MsndSTheater,赋值后采用MsndSTheaters.push_back(mDataMovie)就出错哈。改成静态数组或这压指针就正常了。
我用的是wence5.0系统,内存是128M的,不知道原因了啊
{
int nMovieId;
mxUINT8 nNumberOfShows;
MsndCommonTime aTimes[MAX_SHOW_TIMES];
} MsndSMovieShowTimes;
typedef struct MsndMovieGPS_
{
mxFLOAT64 nLatitude;
mxFLOAT64 nLongitude;
} MsndMovieGPS;
typedef struct MsndSTheater_
{
MsndMovieGPS Location;
TCHAR strTheaterName[MSND_MOVIES_THEATER_NAME_LENGTH];
TCHAR strPhone[MSND_MOVIES_THEATER_PHONE_LENGTH];
TCHAR strAddress[MSND_MOVIES_THEATER_ADDRESS_LENGTH];
MsndSMovieShowTimes aShowTimes[MAX_MOVIES_PER_THEATER];
mxINT32 nNumberOfMovieShowTimes;
mxFLOAT64 Distance;
} MsndSTheater;
#define MsndSTheaters std::vector<MsndSTheater *>
MsndSMovies m_mDataMovie
在函数中定义一个MsndSTheater,赋值后采用MsndSTheaters.push_back(mDataMovie)就出错哈。改成静态数组或这压指针就正常了。
我用的是wence5.0系统,内存是128M的,不知道原因了啊
#34
最大的可能就是你的复制函数的没有实现,是用编译器默认的所以就错了。对于简单的内型编译器还能应付,
对视本事对象型或是指针的出错可能性很大。
#35
对视本事对象型或是指针的出错可能性很大。
===========
对于复杂对象和指针出错的可能性很大。
===========
对于复杂对象和指针出错的可能性很大。
#36
你们的意思就是说,如果定义的结构体太过于复杂,就不能采用vector来直接存放了,只能通过压指针的方式了?但是WinCE系统好像没有内存管理机制,最好不要用new来动态分配内存的啊?不知道我说的对不对哈,请指教。
#37
mark
#38
不是,我的意思是指结构体里面有自定义对象,而这个自定义对象里面有其他对象指针,但是有没有写赋值构造函数函数,出错是一定的。对于pod不会错误。
#39
这个是个好的方法,
减少拷贝,时间空间,都是一大节约。
#40
这个讨论不错,mark 先
#41
mark
#42
mark
#43
LZ压指针好一些啊,效率高啊
#44
老大你压指针嘛
-----------
弱问一声:压指针怎么用?和直接push_back()有什么不一样,哪位高人举例说明一下?
-----------
弱问一声:压指针怎么用?和直接push_back()有什么不一样,哪位高人举例说明一下?
#45
直接压需要调用元素的拷贝构造函数,因此元素越复杂,效率就越低。压指针就没有这个问题,可以大大提高效率。
#46
64byte 栈的路过。
#47
最好别压大的对象,用指针替换,效率高。。不过我还是觉得压大对象不会出错,是你代码问题。
#48
同意!严重同意的说。
#49
我本来改成了压指针的,但是现在又让我改成静态数组了。老大说不让压指针,说是wince下系统自己没有内存管理机制,说容易造成内存碎片,不知道有没有这个问题存在?
#50
你老大是谁?vector内存是由stl管理的,本身就是为了解决内存碎片问题而设计的内存池。唉,你老大!