在我的模板类示例中,出现“分段错误(核心转储)”错误
Posted
技术标签:
【中文标题】在我的模板类示例中,出现“分段错误(核心转储)”错误【英文标题】:In my template class example, “segmentation fault (core dumped)” error occurs 【发布时间】:2017-05-19 14:27:15 【问题描述】:在我的代码中,我想创建一个 cookie 并将其添加到商店,方法是将 cookie 作为参数发送到商店构造函数。它添加了cookie但给出了分段错误错误。
我得到了结果:
-
巧克力曲奇 50 180
分段错误(核心转储)!
我找不到错误的代码部分。你能帮忙吗?
main.cpp:
#include <iostream>
#include <string>
#include "Shop.h"
#include "Cookie.h"
using namespace std;
int main()
Cookie cookie1("Chocolate Cookie", 50, 180);
Cookie cookie2("Cake Mix Cookie", 60, 200);
Shop<Cookie> cookieShop(cookie1);
//cookieShop.Add(cookie2);
cout << cookieShop ;
return 0;
商店.h:
#ifndef SHOP_T
#define SHOP_T
#include <string>
using namespace std;
template<class type>
class Shop;
template<typename type>
ostream& operator<<(ostream& out, const Shop<type>& S)
for(int i = 0; i < S.size; i++)
out << i + 1 << ".\t" << S.list[i] << endl;
template<class type>
class Shop
type *list;
int size;
public:
Shop() list = 0; size = 0;
Shop(type t);
~Shop() delete[] list;
void Add(type A);
friend ostream& operator<< <>(ostream& out, const Shop<type>& S);
;
template<class type>
Shop<type>::Shop(type t) : size(0)
list = new type();
list[0] = t;
size++;
template<class type>
void Shop<type>::Add(type A)
type *temp = new type[size+1];
for(int i = 0; i < size; i++)
temp[i] = list[i];
delete[] list;
temp[size] = A;
list = temp;
size++;
#endif
Cookie.h:
#ifndef COOKIE
#define COOKIE
#include <string>
using namespace std;
class Cookie
string name;
int piece;
float price;
public:
Cookie(string = "", int = 0, float = 0);
friend ostream& operator<<(ostream& out, const Cookie& C);
;
#endif
Cookie.cpp:
#include "Cookie.h"
#include <iostream>
#include <string>
using namespace std;
Cookie::Cookie(string n, int pi, float pr)
name = n;
piece = pi;
price = pr;
ostream& operator<<(ostream& o, const Cookie& C)
o << C.name << "\t" << C.piece << "\t" << C.price;
【问题讨论】:
这是怎么编译的 是的,编译器警告会立即对您大喊大叫,因为没有从声明为返回值的函数中返回值... @Ðаn:我使用 Dev-C++。我观看了一些有关调试的视频并尝试了我的代码。但它不评估商店 cotr。我不知道是我调试错误还是编译器无法做到这一点。我读过 cotrs 没有被调试。这是真的吗?如果可以,我该怎么做。 @Murat 如果你在构造第一个Cookie
时就遇到了段错误,那么显然问题就在那里。那么,为什么您会期望看到调试器到达Shop
构造函数,该构造函数稍后在您的main()
中调用,而它在此之前崩溃并且永远无法到达它?此外,请搜索有关使用 stdlib 容器而不是原始 new
和 delete
以及使用构造函数初始化列表而不是在 ctor 主体中设置成员变量的信息。哦 - 不使用using namespace std;
。
当我尝试调试时,我从int main()
行开始,然后单击“下一行”,直到出现return 0;
。在此之前,它会打印 cookie1
并且不会给出 segfault 错误。如果我继续单击“下一行”,它会回到行Shop<Cookie> cookieShop(cookie1);
,然后我再次单击“下一行”按钮,它会给出 seg 错误。我不明白。
【参考方案1】:
您忘记在两个operator<<
函数中返回ostream。
这会在链接 <<
操作时导致未定义的行为。
例如它等价于:
o.operator<<(C.name).operator<<("\t")
o.operator<<(C.name)
的返回值未定义,导致下一个 .operator<<
引用无效
【讨论】:
@Murat 如果您应用了帖子中给出的建议,并且问题仍然存在(这让我有点惊讶,但是好的),那么它没有回答您的问题,那么您为什么将其标记为答案?以上是关于在我的模板类示例中,出现“分段错误(核心转储)”错误的主要内容,如果未能解决你的问题,请参考以下文章