下面这段代码中的错误,我没有头绪喔.
我想知道为什么把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;

解决方案 »

  1.   

    sz tt;
    tt是在栈上构造的,如果你设定的栈大小于sizeof(tt),就不能运行了。
      

  2.   

    直接new出来吧。用堆内存
    sz *tt = new sz; 
      

  3.   


    我这里要管理太多的缓冲区,所以想用上面的方式交给STL处理
    直接new的话管理太费劲了其实我想问的是按照这样的方式使用STL管理内存会不会不好,或有什么更好的方法
      

  4.   

    vc6使用stl问题很多,非要用stl的话考虑换个编译器吧
      

  5.   

    #include "stdafx.h"#include <iostream>#include <map> 
    #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; 
      

  6.   

    谢谢hhyttppd
    不过 在你的代码里面加上这一句 a.insert(MyMap::value_type(1,q)); 同样还是报错 
      

  7.   

    数组局部变量,定义的太大,会爆栈,用new就好了。
      

  8.   

    为什么char data[1365]不用string代替呢? 
      

  9.   

    你还是用指针吧,queue会复制。另外我用vs2005编译是不会出问题的。
    #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; 

      

  10.   

    char data[200000]; 是在栈上分配内存的 把栈设大一点就行了,
     打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后
    在Reserve中设定堆栈的最大值和commit。注意:reserve默认值为1MB,最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较
    大会使栈开辟较大的值,可能增加内存的开销和启动时间