- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我实现了一个 Stack 类并尝试利用该类来解决 Hanoi 问题。这是我的代码:
template<class Datatype>
class Node
{
public:
Node()
{
next = NULL;
prev = NULL;
}
Node* getNext()
{
return next;
}
Node* getPrev()
{
return prev;
}
Datatype* getData()
{
return &data;
}
void changeNext()
{
next = NULL;
}
void changeNext(Node& nextNode)
{
next = &nextNode;
}
void changePrev()
{
prev = NULL;
}
void changePrev(Node& prevNode)
{
prev = &prevNode;
}
Node* addNext(Node &);
Node* addPrev(Node &);
void nodeDel();
void addData(Datatype &);
private:
Node* next;
Node* prev;
Datatype data;
};
template<class Datatype>
class Stack
{
public:
Stack() : head( NULL )
{
}
virtual ~Stack()
{
Datatype temp;
while (pop(temp));
cout << "Stack released all spaces" << endl;
}
public:
virtual int push(Datatype &);
virtual int pop(Datatype &);
virtual Datatype* peek();
protected:
Node<Datatype> *head;
};
template <class Datatype>
int Stack<Datatype>::push(Datatype &new_data)
{
Node<Datatype> *pt_node = new Node<Datatype>;
if (pt_node == NULL)
return -1;
pt_node -> addData(new_data);
if (head == NULL)
head = pt_node;
else
{
pt_node -> addPrev(*head);
head = pt_node;
}
//cout << *(head -> getData()) << endl;
return 0;
}
template <class Datatype>
int Stack<Datatype>::pop(Datatype &pop_data)
{
if (head == NULL)
return 0;
pop_data = *(head -> getData());
if (head -> getNext() == NULL)
{
delete head;
head = NULL;
}
else
{
Node<Datatype>* temp = head;
head = head -> getNext();
delete temp;
}
return 1;
}
上面声明了 Stack 类
并实现了 pop()
和 push()
函数。现在,我声明我的 Hanoi 类并实现功能。
class Hanoi
{
public:
Hanoi(int num) : a_tower(), b_tower(), c_tower()
{
deep = num;
int i;
for (i = num; i != 0; i --)
a_tower.push(i);
}
public:
void workdone(int, Stack<int>&, Stack<int>&, Stack<int>&);
void showret();
public:
Stack<int> a_tower;
Stack<int> b_tower;
Stack<int> c_tower;
int deep;
};
void Hanoi::workdone(int deep_num, Stack<int>& A, Stack<int>& B, Stack<int>& C)
{
int temp;
if (deep_num == 1)
{
A.pop(temp);
C.push(temp);
}
else
{
Hanoi::workdone(deep_num - 1, A, C, B);
A.pop(temp);
C.push(temp);
Hanoi::workdone(deep_num - 1, B, A, C);
}
}
void Hanoi::showret()
{
int temp;
while (c_tower.pop(temp) != 0)
cout << temp << endl;
}
这是我的测试代码:
int main()
{
Hanoi test(STACK_DEEP);
test.workdone(STACK_DEEP, test.a_tower, test.b_tower, test.c_tower);
test.showret();
return 0;
}
输出是:
*** glibc detected *** ./3_4: double free or corruption (fasttop): 0x090c0038 ***
我认为调用 ~Hanoi 时会发生此问题,但我真的不知道为什么会发生这种情况。
在这里,我发布了可以得到这个结果的完整代码:我的节点.h
#include <iostream>
using namespace std;
template<class Datatype>
class Node
{
public:
Node()
{
next = NULL;
prev = NULL;
}
Node* getNext()
{
return next;
}
Node* getPrev()
{
return prev;
}
Datatype* getData()
{
return &data;
}
void changeNext()
{
next = NULL;
}
void changeNext(Node& nextNode)
{
next = &nextNode;
}
void changePrev()
{
prev = NULL;
}
void changePrev(Node& prevNode)
{
prev = &prevNode;
}
Node* addNext(Node &);
Node* addPrev(Node &);
void nodeDel();
void addData(Datatype &);
private:
Node* next;
Node* prev;
Datatype data;
};
template<class Datatype>
class Stack
{
public:
Stack() : head( NULL )
{
}
virtual ~Stack()
{
Datatype temp;
while (pop(temp));
cout << "Stack released all spaces" << endl;
}
public:
virtual int push(Datatype &);
virtual int pop(Datatype &);
virtual Datatype* peek();
protected:
Node<Datatype> *head;
};
template <class Datatype>
Node<Datatype>* Node<Datatype>::addNext(Node<Datatype>& exi_node)
{
if (exi_node.getNext() == NULL)
{
changePrev(exi_node);
exi_node.changeNext(*this);
}
else
{
Node* next = exi_node.getNext();
changePrev(exi_node);
changeNext(*next);
exi_node.changeNext(*this);
next -> changePrev(*this);
}
return &exi_node;
}
template <class Datatype>
Node<Datatype>* Node<Datatype>::addPrev(Node<Datatype>& exi_node)
{
if (exi_node.getPrev() == NULL)
{
changeNext(exi_node);
exi_node.changePrev(*this);
}
else
{
Node* prev = exi_node.getPrev();
changePrev(*prev);
changeNext(exi_node);
exi_node.changePrev(*this);
prev -> changeNext(*this);
}
return &exi_node;
}
template<class Datatype>
void Node<Datatype>::nodeDel()
{
if (prev == NULL && next == NULL)
;
else if (prev == NULL)
{
Node* next = getNext();
next -> changePrev();
}
else if (next == NULL)
{
Node* prev = getPrev();
prev -> changeNext();
}
else
{
Node* next = getNext();
Node* prev = getPrev();
next -> changePrev(*prev);
prev -> changeNext(*next);
}
delete this;
return;
}
template <class Datatype>
void Node<Datatype>::addData(Datatype &new_data)
{
data = new_data;
}
template <class Datatype>
int Stack<Datatype>::push(Datatype &new_data)
{
Node<Datatype> *pt_node = new Node<Datatype>;
if (pt_node == NULL)
return -1;
pt_node -> addData(new_data);
if (head == NULL)
head = pt_node;
else
{
pt_node -> addPrev(*head);
head = pt_node;
}
//cout << *(head -> getData()) << endl;
return 0;
}
template <class Datatype>
int Stack<Datatype>::pop(Datatype &pop_data)
{
if (head == NULL)
return 0;
pop_data = *(head -> getData());
if (head -> getNext() == NULL)
{
delete head;
head = NULL;
}
else
{
Node<Datatype>* temp = head;
head = head -> getNext();
delete temp;
}
return 1;
}
template <class Datatype>
Datatype* Stack<Datatype>::peek()
{
if (head == NULL)
return NULL;
return (this->head)->getData();
}
3_4.h
#include <iostream>
#include "my_node.h"
using namespace std;
class Hanoi
{
public:
Hanoi(int num) : a_tower(), b_tower(), c_tower()
{
deep = num;
int i;
for (i = num; i != 0; i --)
a_tower.push(i);
}
public:
void workdone(int, Stack<int>&, Stack<int>&, Stack<int>&);
void showret();
public:
Stack<int> a_tower;
Stack<int> b_tower;
Stack<int> c_tower;
int deep;
};
void Hanoi::workdone(int deep_num, Stack<int>& A, Stack<int>& B, Stack<int>& C)
{
int temp;
if (deep_num == 1)
{
A.pop(temp);
C.push(temp);
}
else
{
Hanoi::workdone(deep_num - 1, A, C, B);
A.pop(temp);
C.push(temp);
Hanoi::workdone(deep_num - 1, B, A, C);
}
}
void Hanoi::showret()
{
int temp;
while (c_tower.pop(temp) != 0)
cout << temp << endl;
}
3_4.cpp
#include <iostream>
#include "3_4.h"
using namespace std;
#define STACK_DEEP 4
int main()
{
Hanoi test(STACK_DEEP);
test.workdone(STACK_DEEP, test.a_tower, test.b_tower, test.c_tower);
test.showret();
return 0;
}
我使用的命令:
g++ -Wall 3_4.cpp -o 3_4
最佳答案
代码比它需要的更复杂(和困惑),但错误归结为 Node::addPrev 的错误实现
最小的修复是将此函数的实现更改为:
template <class Datatype>
Node<Datatype>* Node<Datatype>::addPrev(Node<Datatype>& exi_node)
{
exi_node.prev = this;
this->next = &exi_node;
return &exi_node;
}
适当的修复将涉及将 Stack 和 Node 类更改为更简单的实现——正如之前的评论者所提到的,它不需要是双链表。
关于c++ - 在 C++ 中使用递归方法时双重释放或损坏 (fasttop),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22183437/
我正在清除以前的 malloc 中的内存,并且收到此错误:“./prot”中的错误:双重释放或损坏(fasttop)。我为某些结构分配了内存,但在尝试释放它们时遇到了此错误。这是我使用的结构: str
我写了下面的一段代码,得到了上面提到的错误 谁能告诉我哪里错了 谢谢。 #include "iostream" #include "sstream" #include int main() {
我的程序涉及在队列中组合树列表,我的程序编译完美并且适用于大约一半的代码然后向我抛出这个错误。我已经将它缩小到涉及我的 freeTree 以及我如何在编码文件中调用它,对于一些背景故事,这是基于文本文
大家好,我有一个像这样的数组大小调整函数 int add_time_element (time_t *array, time_t element, size_t *size) { if (NU
我有以下类,我在其中强制编译器生成所有复制/移动构造函数和赋值运算符。 class foo { public: float *x; size_t size; foo(int m
我看到了这个错误: *** glibc detected *** perl: double free or corruption (fasttop): 0x0000000003c1daa0 *** 错
我的代码的以下部分在执行 * glibc detected ./a.out: double free or corruption (fasttop): 0x08e065d0 时给我这个消息** 我已经
我在下面的代码中收到了双重免费或损坏(fasttop)。似乎无法弄清楚哪个指针正在创建此错误。看起来错误是在 echo_cnt 函数的 while 循环中产生的。谢谢! static void
所以我正在使用可调整大小的数组实现堆,每次重新分配内存时我都会收到此错误。问题在于 realloc ..我只是不明白它出了什么问题。这是插入函数: void* insert (data_t *data
我要使用ast_malloc和ast_realloc函数拼接一个长字符串。当我加载这个模块时,会发生段错误。有什么问题吗?非常感谢!Asterisk 的输出如下: *** glibc detected
我刚遇到一个奇怪的问题。我将在下面粘贴完整的代码: #include #include #include using namespace std; // declare a base c
以下方法在运行时生成双重释放或损坏 (fasttop) 错误(在第一行)。它是随机发生的,即它可能在程序运行的第一秒或第 35 秒发生。 QSharedPointer Utils::loadImg(Q
我的程序得到以下输出: $ ./list Enter list 1: [1,2,3,4] [ Enter list 2: [2,5,8,0] [ [1,2,3,4] [1,2,3,4] ***
对 QByteArray 的清除调用会产生以下异常: * 检测到 glibc */home/yan/FPS2/FPS2: double free or corruption (fasttop): 0
我实现了一个 Stack 类并尝试利用该类来解决 Hanoi 问题。这是我的代码: template class Node { public: Node() {
我正在尝试动态分配一个数组来从命令行读取用户输入。它可以工作 99/100 次,但如果我重复输入一堆字符,有时会出现段错误错误或双重释放或损坏(fasttop)错误。此错误相对难以重现。 我很确定错误
我想编写简单的智能指针,但遇到了问题。这只是代码的一部分,但我在这里发现了问题: #include using namespace std; class Number{ public:
基于 valgrind,我相信我的错误源于这些人,因为错误发生在我将一个新集分配给另一个集之后。 Set Z -> A^B(返回 Set 的交集运算)。我只是不确定我做错了什么,任何帮助将不胜感激!
我想知道为什么下面的程序在运行时会出现“double free or corruption (fasttop)”的错误。我知道我可以使用字符串而不是字符数组。但我想使用具有动态内存分配的字符数组。你能
我在运行 Linux 的远程服务器上使用 httr 授权谷歌分析 API。到目前为止,该代码一直运行完美,而且它仍然可以在我们的本地机器上运行。不幸的是,由于这是 API 授权,因此不容易重现。 en
我是一名优秀的程序员,十分优秀!