求大佬指教,服务器处理数据的超简单模拟,内存崩溃

yi__cao 2018-04-15 05:29:09
#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

class ServiceBase{
private:
char *servicetype;
public:
ServiceBase(const char *s){
strcpy(servicetype,s);
}
char *Getservicetype(){ return servicetype;}
virtual void open(const char *url) = 0;
virtual void query(const char *cmd) = 0;
virtual void close(const char *url) = 0;
void order(const char *url, const char *cmd){
open(url); query(cmd); close(url);
}
};

class FileSystem:public ServiceBase{

public:
FileSystem():ServiceBase("fs"){ cout << "constructor" << endl;}
void open(const char *url){
cout << "open a filesystem..." << endl;
}
void query(const char *cmd){
cout << "in" << cmd << endl;
cout << "in filesystem querying data..." << endl;
}
void close(const char *url){
cout << "close the fiilsystem..." << endl;
}
};

class DataBase:public ServiceBase{
public:
DataBase():ServiceBase("db"){}
void open(const char *url){
cout << "open a database..." << endl;
}
void query(const char *cmd){
cout << "in" << cmd << endl;
cout << "in database querying data..." << endl;
}
void close(const char *url){
cout << "close the database..." << endl;
}
};

class Controller{
private:

vector<ServiceBase*> pool;
public:
ServiceBase *creat(const char *s){
ServiceBase *ser = NULL;
if(strcmp(s,"db") == 0){
cout << "creat db service" << endl;
ser = new DataBase;
pool.push_back(ser);
}
else if(strcmp(s,"fs") == 0){
cout << "creat fs service" << endl;
FileSystem a;
ser = &a;
pool.push_back(ser);
}
cout <<2 ;
return ser;
}
ServiceBase *service(const char *s){
vector<ServiceBase*>::iterator it;
for(it = pool.begin(); it != pool.end(); it ++){
ServiceBase *ser = *it;
if(strcmp(ser->Getservicetype(),s) == 0){
return ser;
}
}
ServiceBase *ss = creat(s); cout <<1;
return ss;
}
};

struct request{
const char *service;
const char *url;
const char *cmd;
};
int main()
{
Controller con;
request req[4] ={ {"fs","d:\\test","salary"},
{"db","10.64.6.4","select * from user"},
{"db","10.64.6.10","selec * from book"},
{"fs","c:\\stu","student"}};
for(int i = 0; i < 4; i ++){
cout << "--------------begin----------------" << endl;
ServiceBase *ser = con.service(req[i].service);
cout << 1 << endl;
ser->order(req[i].url,req[i].cmd);
cout << "---------------end-----------------" << endl;
}
return 0;
}

第一次循环是文件循环,直接调用控制器的service函数,输出了2,而没有输出1,说明在creat函数返回处出现错误,求大佬指点错误处
...全文
862 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-04-16
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
yi__cao 2018-04-16
  • 打赏
  • 举报
回复
感谢,大佬们的回答,昨天又调了一个小时终于弄好了,指针真的是个难弄的东西,感谢大佬,又学到了东西,兴奋~~~
真相重于对错 2018-04-15
  • 打赏
  • 举报
回复
引用 3 楼 yi__cao 的回复:
的、如果使用动态内存分配,甚至2都输出不了 else if(strcmp(s,"fs") == 0){ cout << "creat fs service" << endl; ser = new FileSystem; pool.push_back(ser); } cout <<2 ; return ser;
一楼指出了你的一个错误,我指出了另外一个。
yi__cao 2018-04-15
  • 打赏
  • 举报
回复
的、如果使用动态内存分配,甚至2都输出不了 else if(strcmp(s,"fs") == 0){ cout << "creat fs service" << endl; ser = new FileSystem; pool.push_back(ser); } cout <<2 ; return ser;
真相重于对错 2018-04-15
  • 打赏
  • 举报
回复
else if(strcmp(s,"fs") == 0){ cout << "creat fs service" << endl; FileSystem a; ser = &a; pool.push_back(ser); } 你把局部变量的地址压入了vector,所以当函数结束,这个地址就无效了,因此出错
www_adintr_com 2018-04-15
  • 打赏
  • 举报
回复
char *servicetype 指针未初始化

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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