“”中的 C++ 错误:free():无效指针
C++ Error in ' ' : free(): invalid pointer
我已经通读过类似的问题,但找不到任何专门解决我的问题的内容(或者我根本不理解其他解决方案)
我正在尝试实现模板堆栈 class,但在尝试推送到堆栈时遇到问题。这是我的 Stack.cpp:
#ifndef _STACK_H
#define _STACK_H
#include <string>
#include <stdio.h>
#include "Node.cpp"
template<typename T>
class Stack{
private:
Node<T>* mHead;
public:
Stack();
~Stack();
void push(T data);
};
template<typename T>
Stack<T>::Stack(){
mHead = NULL;
}
template<typename T>
Stack<T>::~Stack(){
delete mHead;
}
template<typename T>
void Stack<T>::push(T data){ // <-- having trouble with this method
Node<T>* temp = new Node<T>;
temp->data = data;
//if head is already empty, just create 1 Node
if(mHead==NULL){
printf("if working\n");
mHead = temp;
}else{
printf("else working\n");
//rearrange Nodes
temp->next = mHead;
mHead = temp;
}
printf("success\n");
}
#endif
push() 从管理器中的函数调用 class:
void Manager::testPush(){
Stack<int> test;
int number = 3;
test.push(3);
}
当我 运行 代码并调用管理器 testPush() 方法时,我打印了以下内容:
if working
success
*** Error in `./assignment': free(): invalid pointer: 0x0000000000f11078 ***
[1] 14976 abort (core dumped) ./assignment
我不确定 free() 是什么意思,以及可能导致此问题的原因 error/abort
您似乎忘记在节点临时文件中的 NULL 旁边设置数据成员。
template<typename T>
void Stack<T>::push(T data){ // <-- having trouble with this method
Node<T>* temp = new Node<T>;
temp->data = data;
temp->next = NULL; // <=== add this statement
//if head is already empty, just create 1 Node
if(mHead==NULL){
printf("if working\n");
mHead = temp;
如果 class 节点有一个带两个参数的构造函数,或者如果它是一个聚合,你可以写得更简单
template<typename T>
void Stack<T>::push( const T &data )
{
mHead = new Node<T> { data, mHead };
}
考虑到 class 节点的析构函数必须删除堆栈中的所有节点。
这个函数
void Manager::testPush(){
Stack<int> test;
int number = 3;
test.push(3);
}
看起来也有问题,因为 test 是函数的局部变量。堆栈只能在函数内部使用。
我已经通读过类似的问题,但找不到任何专门解决我的问题的内容(或者我根本不理解其他解决方案)
我正在尝试实现模板堆栈 class,但在尝试推送到堆栈时遇到问题。这是我的 Stack.cpp:
#ifndef _STACK_H
#define _STACK_H
#include <string>
#include <stdio.h>
#include "Node.cpp"
template<typename T>
class Stack{
private:
Node<T>* mHead;
public:
Stack();
~Stack();
void push(T data);
};
template<typename T>
Stack<T>::Stack(){
mHead = NULL;
}
template<typename T>
Stack<T>::~Stack(){
delete mHead;
}
template<typename T>
void Stack<T>::push(T data){ // <-- having trouble with this method
Node<T>* temp = new Node<T>;
temp->data = data;
//if head is already empty, just create 1 Node
if(mHead==NULL){
printf("if working\n");
mHead = temp;
}else{
printf("else working\n");
//rearrange Nodes
temp->next = mHead;
mHead = temp;
}
printf("success\n");
}
#endif
push() 从管理器中的函数调用 class:
void Manager::testPush(){
Stack<int> test;
int number = 3;
test.push(3);
}
当我 运行 代码并调用管理器 testPush() 方法时,我打印了以下内容:
if working
success
*** Error in `./assignment': free(): invalid pointer: 0x0000000000f11078 ***
[1] 14976 abort (core dumped) ./assignment
我不确定 free() 是什么意思,以及可能导致此问题的原因 error/abort
您似乎忘记在节点临时文件中的 NULL 旁边设置数据成员。
template<typename T>
void Stack<T>::push(T data){ // <-- having trouble with this method
Node<T>* temp = new Node<T>;
temp->data = data;
temp->next = NULL; // <=== add this statement
//if head is already empty, just create 1 Node
if(mHead==NULL){
printf("if working\n");
mHead = temp;
如果 class 节点有一个带两个参数的构造函数,或者如果它是一个聚合,你可以写得更简单
template<typename T>
void Stack<T>::push( const T &data )
{
mHead = new Node<T> { data, mHead };
}
考虑到 class 节点的析构函数必须删除堆栈中的所有节点。
这个函数
void Manager::testPush(){
Stack<int> test;
int number = 3;
test.push(3);
}
看起来也有问题,因为 test 是函数的局部变量。堆栈只能在函数内部使用。