一个c++的程序调试出了问题,请大神给看看,我用vs2010分步调试好像是 return 处有了问题
/*以下是list.h*/#include<iostream>usingnamespacestd;template<classT>structnode{node<T>*n...
/*以下是list.h*/
#include<iostream>using namespace std;
template<class T>
struct node
{
node<T> *next;
T x;
};
template<class T>
class list
{
private:
node<T> *p;
node<T> *head;
node<T> *tp;
int size;
public:
list();
~list();
void add(T x);//加入新元素
void insert(T x,int n);//在N处插入一个元素
T* print();//遍历链表
T get(int n);//取出第n 个的元素
int empty();//判断是否为空表,若空返回1
int getsize();// 表中元素的个数
};
template<class T>
list<T>::~list()
{
cout<<"destorying!!"<<endl;
tp=head;
for(int i=0;i<size+1;i++)
{
head=head->next;
delete tp;
tp=head;
}
}
template<class T>
list<T>::list()
{
size=0;
head=new node<T>;
p=head;
p->next=NULL;
tp=NULL;
}
template<class T>
void list<T>::add(T xx)
{
p->next=new node<T>;
p=p->next;
p->x=xx;
p->next=NULL;
size++;
}
template<class T>
void list<T>::insert(T xx,int n)
{
if(empty())
{
add(xx);
return;
}
if(n>size||n<1)
{
cout<<"out of range!!"<<endl;
return;
}
tp=head;
if(n!=1)
for(int i=0;i<n-1;i++)
tp=tp->next;
node<T> *pp=new node<T>;
pp->x=xx;
pp->next=tp->next;
tp->next=pp;
size++;
}
template<class T>
T* list<T>::print()
{
tp=head;
T *pp;
pp=new T[size];
for(int i=0;i<size;i++)
{
tp=tp->next;
*(pp+i)=tp->x;
}
return pp;
}
template<class T>
T list<T>::get(int n)
{
if(n<1||n>size)
{
cout<<"out of range!!!"<<endl;
system("pause");
exit(0);
}
else {
tp=head;
for(int i=0;i<n;i++)
tp=tp->next;
return tp->x;
}
}
template<class T>
int list<T>::empty()
{
if(size==0)
return 1;
else return 0;
}
template<class T>
int list<T>::getsize()
{
return size;
}
/*以下是主程序*/
#include<iostream>
#include<string>
#include"list.h"
struct wordnode
{
string s;
list<int> lst;
};
list<wordnode> fun(string s)
{
list<wordnode> ll;
wordnode *p;
p=new wordnode;
p->s=s;
p->lst.add(3);
ll.add(*p);
return (ll);
}
void main()
{
string a;
a="goodnight!!";
fun(a);
//cout<<fun(a).get(1).s<<endl;
system("pause");
} 展开
#include<iostream>using namespace std;
template<class T>
struct node
{
node<T> *next;
T x;
};
template<class T>
class list
{
private:
node<T> *p;
node<T> *head;
node<T> *tp;
int size;
public:
list();
~list();
void add(T x);//加入新元素
void insert(T x,int n);//在N处插入一个元素
T* print();//遍历链表
T get(int n);//取出第n 个的元素
int empty();//判断是否为空表,若空返回1
int getsize();// 表中元素的个数
};
template<class T>
list<T>::~list()
{
cout<<"destorying!!"<<endl;
tp=head;
for(int i=0;i<size+1;i++)
{
head=head->next;
delete tp;
tp=head;
}
}
template<class T>
list<T>::list()
{
size=0;
head=new node<T>;
p=head;
p->next=NULL;
tp=NULL;
}
template<class T>
void list<T>::add(T xx)
{
p->next=new node<T>;
p=p->next;
p->x=xx;
p->next=NULL;
size++;
}
template<class T>
void list<T>::insert(T xx,int n)
{
if(empty())
{
add(xx);
return;
}
if(n>size||n<1)
{
cout<<"out of range!!"<<endl;
return;
}
tp=head;
if(n!=1)
for(int i=0;i<n-1;i++)
tp=tp->next;
node<T> *pp=new node<T>;
pp->x=xx;
pp->next=tp->next;
tp->next=pp;
size++;
}
template<class T>
T* list<T>::print()
{
tp=head;
T *pp;
pp=new T[size];
for(int i=0;i<size;i++)
{
tp=tp->next;
*(pp+i)=tp->x;
}
return pp;
}
template<class T>
T list<T>::get(int n)
{
if(n<1||n>size)
{
cout<<"out of range!!!"<<endl;
system("pause");
exit(0);
}
else {
tp=head;
for(int i=0;i<n;i++)
tp=tp->next;
return tp->x;
}
}
template<class T>
int list<T>::empty()
{
if(size==0)
return 1;
else return 0;
}
template<class T>
int list<T>::getsize()
{
return size;
}
/*以下是主程序*/
#include<iostream>
#include<string>
#include"list.h"
struct wordnode
{
string s;
list<int> lst;
};
list<wordnode> fun(string s)
{
list<wordnode> ll;
wordnode *p;
p=new wordnode;
p->s=s;
p->lst.add(3);
ll.add(*p);
return (ll);
}
void main()
{
string a;
a="goodnight!!";
fun(a);
//cout<<fun(a).get(1).s<<endl;
system("pause");
} 展开
3个回答
展开全部
list<wordnode> fun(string s)
{
list<wordnode> ll;
wordnode *p;
p=new wordnode;
p->s=s;
p->lst.add(3);
ll.add(*p);
return (ll);
}
返回一个局部变量地址是错误的,在栈上的数据是不会保留的函数return的时候
list<wordnode> ll;也被释这样就出错了。
解决方法1 返回一个堆上的数据自己new出来,这样会有内存泄漏 记得释放 所以这个函数应该类似这样
list<wordnode>× fun(string s)
2传入引用或者指针来分配内存。
bool fun(
list<wordnode>× fun,string s)
但是你的代码还有很大bug。你的get方法 返回了一个T 而不是T& 这样对地址指针这样的操作。势必你还是会再次访问异常地址。所以你应该吧你的返回值修改为T&。
而且对于list 循环while(p->next)就可以了。不需要知道元素个数。看出你有一定的基础,但是基础还是不太牢固。而且有个比较大问题是代码风格,程序里面需要变量,这样也方便自己分析,如果代码写成你那样 那么你很难调试。因为代码这个时候都会生成临时变量来存储,我们看不到。只有真正懂程序的人可能调试简单。但是显然不是好的风格
你应该类似这样
list<wordnode>* pwt = fun(a);
wordnode wt = pwt ->get(1);
cout << wt.s << endl;
这样你就能追踪每个来数据来回了。
你最大的问题是对数据的存储有效性理解。这样是造成leak和crash的root case。程序员很多时候都是在调试此类问题。
如果想理解还是先去读一下 list stl或则boost的实现。但是对数据结构理解和实现才是重点。
{
list<wordnode> ll;
wordnode *p;
p=new wordnode;
p->s=s;
p->lst.add(3);
ll.add(*p);
return (ll);
}
返回一个局部变量地址是错误的,在栈上的数据是不会保留的函数return的时候
list<wordnode> ll;也被释这样就出错了。
解决方法1 返回一个堆上的数据自己new出来,这样会有内存泄漏 记得释放 所以这个函数应该类似这样
list<wordnode>× fun(string s)
2传入引用或者指针来分配内存。
bool fun(
list<wordnode>× fun,string s)
但是你的代码还有很大bug。你的get方法 返回了一个T 而不是T& 这样对地址指针这样的操作。势必你还是会再次访问异常地址。所以你应该吧你的返回值修改为T&。
而且对于list 循环while(p->next)就可以了。不需要知道元素个数。看出你有一定的基础,但是基础还是不太牢固。而且有个比较大问题是代码风格,程序里面需要变量,这样也方便自己分析,如果代码写成你那样 那么你很难调试。因为代码这个时候都会生成临时变量来存储,我们看不到。只有真正懂程序的人可能调试简单。但是显然不是好的风格
你应该类似这样
list<wordnode>* pwt = fun(a);
wordnode wt = pwt ->get(1);
cout << wt.s << endl;
这样你就能追踪每个来数据来回了。
你最大的问题是对数据的存储有效性理解。这样是造成leak和crash的root case。程序员很多时候都是在调试此类问题。
如果想理解还是先去读一下 list stl或则boost的实现。但是对数据结构理解和实现才是重点。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询