提问人:Máté Hermann 提问时间:5/28/2023 更新时间:5/28/2023 访问量:72
使用泛型列表时如何解决SIGTRAP错误?
How to solve SIGTRAP error when using generic list?
问:
我在代码 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 错误。
我假设析构函数有一些东西,但我就是无法处理它。
答: 暂无答案
评论
Csapat
不遵守三分法则。Csapat(Csapat&&) = delete; Csapat& operator=(Csapat&&) = delete;
Csapat
Csapat
std::string
std::string