下面这段代码中的错误,我没有头绪喔.
我想知道为什么把data[1365]设大一点,就报错.
大家帮忙分析下原因吧.
#include "stdafx.h"#include <map>
#include <queue>
using namespace std;
struct sz
{
char data[1365];
};
typedef queue<sz> MyQueue;
typedef map<int, MyQueue> MyMap;
int main(int argc, char* argv[])
{
MyMap a;
sz tt;
MyQueue q;
q.push(tt);
a.insert(MyMap::value_type(1,q));
return 0;
}
我想知道为什么把data[1365]设大一点,就报错.
大家帮忙分析下原因吧.
#include "stdafx.h"#include <map>
#include <queue>
using namespace std;
struct sz
{
char data[1365];
};
typedef queue<sz> MyQueue;
typedef map<int, MyQueue> MyMap;
int main(int argc, char* argv[])
{
MyMap a;
sz tt;
MyQueue q;
q.push(tt);
a.insert(MyMap::value_type(1,q));
return 0;
}
tt是在栈上构造的,如果你设定的栈大小于sizeof(tt),就不能运行了。
sz *tt = new sz;
我这里要管理太多的缓冲区,所以想用上面的方式交给STL处理
直接new的话管理太费劲了其实我想问的是按照这样的方式使用STL管理内存会不会不好,或有什么更好的方法
#include <queue>
using namespace std;
struct sz
{
char data[200000];
};
typedef queue <sz> MyQueue;
typedef map <int, MyQueue> MyMap; void Construct(MyQueue& q)
{
auto_ptr<sz> tt(new sz);
int i = 0;
tt->data[i++] = 'a';
tt->data[i++] = 'b';
tt->data[i++] = 'c';
tt->data[i++] = 'd'; q.push(*tt);
}int main(int argc, char* argv[])
{
MyQueue q;
Construct(q);
sz& tt = q.front(); for(int i = 0; i < 4; ++i)
std::cout << tt.data[i]; return 0;
}
不过 在你的代码里面加上这一句 a.insert(MyMap::value_type(1,q)); 同样还是报错
#include "stdafx.h"#include <iostream>#include <map>
#include <queue> using std::queue;
using std::map;
using std::auto_ptr;
using std::cout;
using std::endl;struct SZ
{
char data[200000];
}; typedef queue <SZ*> MyQueue;
typedef map <int, MyQueue*> MyMap; void push(MyQueue& q)
{
SZ* tt = new SZ;
for(size_t idx = 0; idx < sizeof(tt->data); ++idx)
tt->data[idx] = 'a' + (0xff & (rand() * 10 / RAND_MAX)); q.push(tt);
}void produce(MyMap& a)
{
MyQueue *q = new MyQueue;
//生成随机数
for(int i = 0; i < 20; ++i) push(*q); a.insert(make_pair(1, q));
}void consume(MyMap&a)
{
auto_ptr<SZ> tt; while(!a[1]->empty()){
tt.reset(a[1]->front());
a[1]->pop(); for(int i = 0; i < 4; ++i)
cout << tt->data[i];
cout << endl;
}
}void cleanup(MyMap& a)
{
for(MyMap::iterator itr = a.begin(); itr != a.end(); ++itr){
while(!itr->second->empty()){
delete itr->second->front();
itr->second->pop();
}
delete itr->second;
}
a.clear();
}int main(int argc, char* argv[])
{
MyMap a;
produce(a);
consume(a);
cleanup(a); return 0;
}
打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后
在Reserve中设定堆栈的最大值和commit。注意:reserve默认值为1MB,最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较
大会使栈开辟较大的值,可能增加内存的开销和启动时间