Chinaunix

标题: 类成员变量太大程序会down???? [打印本页]

作者: jiangf    时间: 2009-08-18 14:27
标题: 类成员变量太大程序会down????
不知道C++对类成员变量的大小有没有限制;如下程序,我在一个类里面定义了比较大的成员变量作为索引,这个索引是个数组。当数组的空间太大的时候,程序在构造这个类的时候就会corwdown,不知道大家有没有见过这个问题。要是有这样问题的话该如何解决

typedef struct
{
    time_t MaxTimeStamp;
&nbsp;&nbsp;&nbsp;&nbsp;vector<string> ThridIndex;
}SECOND_INDEX_NODE;

typedef struct
{
&nbsp;&nbsp;&nbsp;&nbsp;u_int32_t nCollisionTimes; &nbsp;&nbsp;&nbsp;&nbsp;map<string,SECOND_INDEX_NODE> SecondIndex;
}FIRST_INDEX_NODE;

class TEST
{
.................
FIRST_INDEX_NODE m_FirstIndex[100000];
.................
}


程序一开起来,运行到构造函数时就down了。我如果把m_FirstIndex的大小缩小10倍就没有事,奇怪了。难道对象的成员有大小限制吗
作者: OwnWaterloo    时间: 2009-08-18 14:37
标题: 回复 #1 jiangf 的帖子
是不是声明了一个TEST的自动变量?

计算一下:
typedef struct
{
    time_t MaxTimeStamp;
    vector<string> ThridIndex;
}SECOND_INDEX_NODE;

这个至少应该有12字节。

class TEST
{
.................
FIRST_INDEX_NODE m_FirstIndex[100000];
.................
};
这个, 就至少100000×12字节 = 1M多字节了。

win32下一般默认栈大小就只有1M。
作者: openspace    时间: 2009-08-18 14:38
标题: 回复 #1 jiangf 的帖子
先将大小缩小10倍
然后创建一个对象,sizeof试试

说句实话,你的对象也太占内存了,还是用动态内存分配
作者: ddkkd    时间: 2009-08-18 14:41
标题: 回复 #1 jiangf 的帖子
同意二楼,应该是栈大小的限制。而不是类的限制。

[ 本帖最后由 ddkkd 于 2009-8-18 14:42 编辑 ]
作者: jiangf    时间: 2009-08-19 14:44
我把这个成员变量改成动态开辟。构造函数通过了,可是往里面插数据时就报错了,到
pIndex[0].mapValue.insert(make_pair(1,"Pather1"));时就报错
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>
#include <vector>
using namespace std;

typedef struct
{
&nbsp;&nbsp;&nbsp;&nbsp;int nCollisionTimes;
&nbsp;&nbsp;&nbsp;&nbsp;map<int,string> mapValue;
}FIRST_INDEX_NODE;

typedef map<int,string>::iterator P_MAP;

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;FIRST_INDEX_NODE *pIndex = (FIRST_INDEX_NODE *)malloc(10*sizeof(FIRST_INDEX_NODE));
&nbsp;&nbsp;&nbsp;&nbsp;pIndex[0].mapValue.insert(make_pair(1,"Pather1"));
&nbsp;&nbsp;&nbsp;&nbsp;free(pIndex);
}

作者: OwnWaterloo    时间: 2009-08-19 14:55
标题: 回复 #5 jiangf 的帖子
原帖由 jiangf 于 2009-8-19 14:44 发表
    FIRST_INDEX_NODE *pIndex = (FIRST_INDEX_NODE *)malloc(10*sizeof(FIRST_INDEX_NODE));
    pIndex[0].mapValue.insert(make_pair(1,"Pather1 "));
    free(pIndex);


大哥你是不是故意来找茬的~~~ 说!
作者: jiangf    时间: 2009-08-19 14:58
为什么这样说呢,确实遇到问题了嘛。
作者: jiangf    时间: 2009-08-19 15:00
楼上的同志有什么好办法呢解决这个问题呢
作者: OwnWaterloo    时间: 2009-08-19 15:03
标题: 回复 #7 jiangf 的帖子
FIRST_INDEX_NODE *pIndex = new FIRST_INDEX_NODE[10];
pIndex[0].mapValue.insert(make_pair(1,"Pather1"));
delete [] pIndex;
作者: yugliu    时间: 2009-08-19 16:52
他这里用malloc 和 free 为什么不行?又不是类,按理也可以的,都是在堆上分配空间
作者: jiangf    时间: 2009-08-19 17:08
原帖由 OwnWaterloo 于 2009-8-19 15:03 发表
FIRST_INDEX_NODE *pIndex = new FIRST_INDEX_NODE[10];
pIndex[0].mapValue.insert(make_pair(1,"Pather1"));
delete [] pIndex;


啊,忽略了map是个类。类的动态开辟只能用new
C写习惯了,呵呵。多谢楼上的
作者: OwnWaterloo    时间: 2009-08-19 17:24
标题: 回复 #10 yugliu 的帖子;回复 #11 jiangf 的帖子
原帖由 yugliu 于 2009-8-19 16:52 发表
他这里用malloc 和 free 为什么不行?又不是类,按理也可以的,都是在堆上分配空间


要用malloc, free也是可以:
T* p = static_cast<T*>(malloc(sizeof(*p)));
new (p) T( arguments, for, consturctor );
p->use();

p->~T();
free(p);


new operator完成2种工作:分配空间, 构造对象。
只使用malloc就少了第2个步骤。

delete operator也是完成2种工作:销毁对象,释放空间。
只free就少了第1个步骤。

上面就是使用malloc、free,并将少的步骤补充完整的方法, 不过不建议这样……
作者: fera    时间: 2009-08-19 20:34
原帖由 OwnWaterloo 于 2009-8-19 17:24 发表


要用malloc, free也是可以:
T* p = static_cast(malloc(sizeof(*p)));
new (p) T( arguments, for, consturctor );
p->use();

p->~T();
free(p);


new operator完成2种工作:分配空间, 构造对 ...

果然大神!
刚才看错了,没注意到有replacement new

[ 本帖最后由 fera 于 2009-8-19 20:35 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2