第一次用vector,在push_back那里出现内存错误

Commencel 2014-04-29 11:02:04
主要是想通过vector实现变长数组,在CB中debug下没有问题,就是在run模式下就出现错误。求帮个忙啊
#include <map>
#include <set>
#include <list>
#include <cmath>
#include<cctype>
#include <ctime>
#include <deque>
#include <stack>
#include <queue>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL long long
#define PI 3.1415926535897932626
using namespace std;
int gcd(int a, int b)
{
return a % b == 0 ? b : gcd(b, a % b);
}
char input[6]={"AGCT"};
typedef struct node
{
//bool flag;//单词结束,这里要标记不是1,0,而是标记输出的字符串下标,
LL value;
LL num;
vector <LL> sym;
struct node *child[4];
}Node;
Node *root;//
long Max;//存层数
string src[100004];
LL N;
LL cas;
bool flag;
Node *s;
LL cur_x[100004],cur_y[100004];
LL cnt;//如果CNT==1,那么不要判断,这里cnt赋值初值为N
LL ans;
inline Node * addnew()
{
Node *p=(Node*)malloc(sizeof(Node));
p->num=p->value=0;
for (int i=0;i<4;i++)
p->child[i]=NULL;
// p->flag=false;
return p;
}
inline void insert(LL index)
{
int w;LL n;
string a=src[index];
n=a.size();
Node *p=root;
for (LL i=0;i<n;i++)
{
for (int j=0;j<4;j++)
if (a[i]==input[j]) {w=j;break;}//input为炉石牌对应字符
if (p->child[w]==NULL)
{
p->child[w]=addnew();
p->child[w]->value=i+1;
}
++p->child[w]->num;
//printf("%d\n",p->child[w]->num);
p->child[w]->sym.push_back(index);//当前路全部加入标记需要,就这里出现内存泄露
//printf("%lld num is %lld value is %lld\n",p->child[w]->sym.back(),p->child[w]->num,p->child[w]->value);
p=p->child[w];
//putchar('\n');
}
}
inline void Delete(long index)//删除2个对应的卡,每两个为一次匹配.每次从容器后开始删除,删除第一个下标。
{
string a=src[index];
LL n=a.size();
Node *p=root;
int w;
for (LL i=0;i<n;i++)
{
for (int j=0;j<4;j++)
if (a[i]==input[j]) {w=j;break;}//input为炉石牌对应字符
p->child[w]->num--;
p->child[w]->sym.erase(remove(p->child[w]->sym.begin(),p->child[w]->sym.end(),index));//删除vector中值为value的元素
p=p->child[w];
}
}
void slove(Node *u)//这个函数存在问题
{
if (cnt<2 || u==NULL || (u->num>=0 && u->num<2)) return ;
if (u->value>Max) {flag=true;Max=u->value;s=u;}//这里注意如果u->num>2已经return了
for (int i=0;i<4;i++)
{
if (u->child[i]!=NULL)
slove(u->child[i]);
}
}
int main()
{
//freopen("sample.txt","r",stdin);
root=(Node *)malloc(sizeof(Node));
root->num=root->value=-1;
for (int i=0;i<4;i++)
root->child[i]=NULL;
scanf("%lld",&N);
ans=0;
cnt=N;
cas=0;
if (N==1){cin>>src[0]; printf("0\n");}
else
{
for (LL i=1;i<=N;i++)
{
cin>>src[i];
insert(i);
}//解决这个问题应该从底层向上层遍历。必须满足num大于2才是一组解
Max=0;
flag=false;
s=NULL;
while (cnt>=2)
{
slove(root);
//printf("%ld Nax\n",Max);
if(flag)
{
ans+=Max;
//printf("%lld num\n",s->num);
cur_x[cas]=s->sym.front();
Delete(s->sym.front());
cur_y[cas++]=s->sym.front();
Delete(s->sym.front());
Max=0;
s=NULL;
cnt-=2;
flag=false;
}
else break;
}
printf("%lld\n",ans);
for (LL i=0;i<cas;i++)
printf("%lld %lld\n",cur_x[i],cur_y[i]);
}
return 0;
}
...全文
285 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
highnewrain 2014-04-29
  • 打赏
  • 举报
回复
inline Node * addnew() { Node *p=new Node; //这里改成new方式 p->num=p->value=0; for (int i=0;i<4;i++) p->child[i]=NULL; // p->flag=false; return p; } 你把addNew函数中动态创建p的方式改为C++中的new应该就行了! 都用C++标准库了,咋还用C语言中的动态申请内存的方式了!! 你自定义的Node结构体类型中包含vector类型,vector类型大小是动态改变的,而你又用这种malloc(sizeof(Node))方式申请内存;肯定是不行!
赵4老师 2014-04-29
  • 打赏
  • 举报
回复
对象的实例不是一段内存,不适合放在结构体内。

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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