使用泛型列表时如何解决SIGTRAP错误?

How to solve SIGTRAP error when using generic list?

提问人:Máté Hermann 提问时间:5/28/2023 更新时间:5/28/2023 访问量:72

问:

我在代码 c++ 中遇到 sigtrap(跟踪/制动点陷阱)错误。 我有一个用于存储团队的通用列表。我有一个地方使用 dinamic 内存分配。我的清单:

#ifndef LISTOFITEMS_HPP
#define LISTOFITEMS_HPP

#include <iostream>
template <class T>
class Csapatok
{
    struct ListaElem
    {
        T adat;
        ListaElem *kov;
    };

    ListaElem *elso;
public:
    Csapatok() : elso(nullptr) {}

    void beszur(const T& dat)
    {
        ListaElem *p = new ListaElem;
        p->adat = dat;
        p->kov = nullptr;

        if(elso == nullptr)
        {
            elso = p;
        }
        else
        {
            ListaElem* akt = elso;
            while (akt->kov != nullptr)
            {
                akt = akt->kov;
            }
            akt->kov = p;
        }
    }

    void torol(const T dat)
    {
        ListaElem* aktualis = elso;
        ListaElem* elozo = nullptr;
        if (aktualis != nullptr && aktualis->adat == dat)
        {
            elso = aktualis->kov;
            delete aktualis;
            return;
        }
        while (aktualis != nullptr && aktualis->adat != dat)
        {
            elozo = aktualis;
            aktualis = aktualis->kov;
        }
        if(aktualis == nullptr)
        {
            return;
        }
        if (elozo == nullptr)
        {
            elso = aktualis->kov;
        }
        else
        {
         elozo->kov = aktualis->kov;
        }
        delete aktualis;
    }
    bool keres(T dat) const
    {
        if(elso->adat == dat)
            return true;
        ListaElem *p = elso;
        while (p->kov != nullptr)
        {
            if(p->adat == dat)
                return true;
            p = p->kov;
        }
        return false;
    }
};

#endif //LISTOFITEMS_HPP


And this is my code for the Teams class:

#ifndef EGYESULET_H
#define EGYESULET_H

#include <iostream>
#include <cstring>
class Csapat{
protected:
    size_t alapletszam = 10;
    size_t letszam =0;
    char *csapetnev;
public:
    Csapat() :csapetnev(nullptr) {}
    Csapat(const char* csnev)  {
        if (csnev != nullptr) {
            csapetnev = new char[strlen(csnev) + 1];
            strcpy(csapetnev, csnev);
        } else {
            csapetnev = nullptr;
        }
    }
    const char* getcsnev() { return csapetnev;}
    ~Csapat()
    {
        delete[] csapetnev;
        std::cout << "csapat dtor"<< std::endl;
    }
};
#endif //EGYESULET_H

我有 3 个来自 Teams 的派生类(如篮球队、足球队等),但它们太简单了,我不把它放在这里。

我有一个测试文件,我只需在其中创建一个足球队对象 f1。然后我使用“beszur”功能将这个团队放入列表中,然后用“keres”检查它是否在列表中。不知何故,当它应该为 true 时它给出 false,因为我可以在调试器中看到它位于其 elso 节点的列表中。然后我尝试用“torol”删除它。这时,我在调试器中的“delete[] csapatok”行处收到 SIGTRAP 错误。

我假设析构函数有一些东西,但我就是无法处理它。

C++ 列出 泛型 内存

评论

0赞 Pepijn Kramer 5/28/2023
你不使用 std::list 有什么原因吗?因此,您可以专注于对其他类进行建模吗?我还看到您为文本使用手动分配的 char*,将您的代码更改为使用 std::string 来保存字符串。所有手动内存管理都会增加错误/崩溃的机会。另一条建议:使用调试器
0赞 molbdnilo 5/28/2023
Csapat不遵守三分法则
0赞 fabian 5/28/2023
添加 ,您将在最终导致双重释放的地方出现编译器错误。(对象的任何副本都会导致数组的共享所有权,从而导致双重释放...帮自己一个忙,用数组代替数组,你就可以免费获得类的复制和移动语义......(如果你这样做,你当然需要删除已删除的特殊成员,以便自动生成复制和移动。Csapat(Csapat&&) = delete; Csapat& operator=(Csapat&&) = delete;CsapatCsapatstd::string
0赞 Máté Hermann 5/28/2023
这是一个学校项目,这就是为什么我不能使用 STL 容器。编辑:我也不能使用std:string。
1赞 john 5/28/2023
@MátéHermann没问题,但你仍然需要遵循三法则来修复你的错误。我完全同意之前的评论。你的老师到底认为他在教你什么,禁止你以任何称职的C++程序员都会做的方式编写代码,即使练习的重点是学习如何编程链表,也没有理由说你不能使用。std::string

答: 暂无答案