在我的模板类示例中,出现“分段错误(核心转储)”错误

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 容器而不是原始 newdelete 以及使用构造函数初始化列表而不是在 ctor 主体中设置成员变量的信息。哦 - 不使用using namespace std; 当我尝试调试时,我从int main() 行开始,然后单击“下一行”,直到出现return 0;。在此之前,它会打印 cookie1 并且不会给出 segfault 错误。如果我继续单击“下一行”,它会回到行Shop&lt;Cookie&gt; cookieShop(cookie1);,然后我再次单击“下一行”按钮,它会给出 seg 错误。我不明白。 【参考方案1】:

您忘记在两个operator&lt;&lt; 函数中返回ostream。 这会在链接 &lt;&lt; 操作时导致未定义的行为。

例如它等价于:

o.operator<<(C.name).operator<<("\t")

o.operator&lt;&lt;(C.name) 的返回值未定义,导致下一个 .operator&lt;&lt; 引用无效

【讨论】:

@Murat 如果您应用了帖子中给出的建议,并且问题仍然存在(这让我有点惊讶,但是好的),那么它没有回答您的问题,那么您为什么将其标记为答案?

以上是关于在我的模板类示例中,出现“分段错误(核心转储)”错误的主要内容,如果未能解决你的问题,请参考以下文章

如何解决错误:我的代码中出现分段错误(核心转储)? AT&T 语法

为啥我的代码中出现分段错误(核心转储)错误?

如何防止我的程序出现此分段错误(核心转储)?

命令行参数分段错误(核心转储)

c++:分段错误(核心转储)

C++ std 线程和列表分段错误(核心转储)