Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
平凡堆栈实现中的内存泄漏 Python和java是我的经验,但我最近决定学习C++。我决定做一个快速的整数堆栈实现,但它有一个巨大的内存泄漏,我无法理解。当我弹出节点时,它似乎并没有释放内存,即使我在弹出时显式删除了旧节点。当我运行它时,它会使用150mb的内存,但在清空堆栈后不会释放任何内存。我将非常感谢任何帮助,因为这是我第一次尝试一种没有垃圾收集的语言。这是在64位Kubuntu上用GCC4.3编译的 //a trivial linked list based stack of integers #include <iostream> using namespace std; class Node { private: int num; Node * next; public: Node(int data, Node * next); int getData(); Node * getNext(); }; Node::Node(int data, Node * next_node) { num = data; next = next_node; } inline int Node::getData() { return num; } inline Node* Node::getNext() { return next; } class Stack { private: unsigned long int n; Node * top; public: Stack(int first); Stack(); void push(int data); int pop(); int peek(); unsigned long int getSize(); void print(); void empty(); }; Stack::Stack(int first) { Node first_top (first, NULL); top = &first_top; n = 1; } Stack::Stack() { top = NULL; n = 0; } void Stack::push(int data) { Node* old_top = top; Node* new_top = new Node(data,old_top); top = new_top; n++; } int Stack::pop() { Node* old_top = top; int ret_num = old_top->getData(); top = old_top->getNext(); delete old_top; n--; return ret_num; } inline int Stack::peek() { return top->getData(); } inline unsigned long int Stack::getSize() { return n; } void Stack::print() { Node* current = top; cout << "Stack: ["; for(unsigned long int i = 0; i<n-1; i++) { cout << current->getData() << ", "; current = current->getNext(); } cout << current->getData() << "]" << endl; } void Stack::empty() { unsigned long int upper = n; for(unsigned long int i = 0; i<upper; i++) { this->pop(); } } Stack createStackRange(int start, int end, int step = 1) { Stack stack = Stack(); for(int i = start; i <= end; i+=step) { stack.push(i); } return stack; } int main() { Stack s = createStackRange(0,5e6); cout << s.peek() << endl; sleep(1); cout << "emptying" <<endl; s.empty(); cout << "emptied" <<endl; cout << "The size of the stack is " << s.getSize()<<endl; cout << "waiting..." << endl; sleep(10); return 0; } //一个简单的基于链表的整数堆栈 #包括 使用名称空间std; 类节点 { 私人: int-num; 节点*下一步; 公众: 节点(int数据,节点*next); int getData(); 节点*getNext(); }; 节点::节点(int数据,节点*下一个节点) { num=数据; 下一个=下一个_节点; } 内联int节点::getData() { 返回num; } 内联节点*节点::getNext() { 下一步返回; } 类堆栈 { 私人: 无符号长整数n; 节点*顶部; 公众: 堆栈(int-first); 堆栈(); 无效推送(int数据); int-pop(); int peek(); 无符号长整型getSize(); 作废打印(); void empty(); }; 堆栈::堆栈(int优先) { 节点第一个\顶部(第一个,空); top=&first_top; n=1; } Stack::Stack() { top=NULL; n=0; } void Stack::push(int数据) { 节点*old_top=top; Node*new_top=新节点(数据,旧_top); 顶部=新的顶部; n++; } int Stack::pop() { 节点*old_top=top; int ret_num=old_top->getData(); top=old_top->getNext(); 删除旧的顶部; n--; 返回ret_num; } 内联int堆栈::peek() { 返回top->getData(); } 内联无符号长整型堆栈::getSize() { 返回n; } void Stack::print() { 节点*当前=顶部; cout_C++_Memory Leaks_Stack - Fatal编程技术网 getData(); top=old_top->getNext(); 删除旧的顶部; n--; 返回ret_num; } 内联int堆栈::peek() { 返回top->getData(); } 内联无符号长整型堆栈::getSize() { 返回n; } void Stack::print() { 节点*当前=顶部; cout,c++,memory-leaks,stack,C++,Memory Leaks,Stack" /> getData(); top=old_top->getNext(); 删除旧的顶部; n--; 返回ret_num; } 内联int堆栈::peek() { 返回top->getData(); } 内联无符号长整型堆栈::getSize() { 返回n; } void Stack::print() { 节点*当前=顶部; cout,c++,memory-leaks,stack,C++,Memory Leaks,Stack" />

平凡堆栈实现中的内存泄漏 Python和java是我的经验,但我最近决定学习C++。我决定做一个快速的整数堆栈实现,但它有一个巨大的内存泄漏,我无法理解。当我弹出节点时,它似乎并没有释放内存,即使我在弹出时显式删除了旧节点。当我运行它时,它会使用150mb的内存,但在清空堆栈后不会释放任何内存。我将非常感谢任何帮助,因为这是我第一次尝试一种没有垃圾收集的语言。这是在64位Kubuntu上用GCC4.3编译的 //a trivial linked list based stack of integers #include <iostream> using namespace std; class Node { private: int num; Node * next; public: Node(int data, Node * next); int getData(); Node * getNext(); }; Node::Node(int data, Node * next_node) { num = data; next = next_node; } inline int Node::getData() { return num; } inline Node* Node::getNext() { return next; } class Stack { private: unsigned long int n; Node * top; public: Stack(int first); Stack(); void push(int data); int pop(); int peek(); unsigned long int getSize(); void print(); void empty(); }; Stack::Stack(int first) { Node first_top (first, NULL); top = &first_top; n = 1; } Stack::Stack() { top = NULL; n = 0; } void Stack::push(int data) { Node* old_top = top; Node* new_top = new Node(data,old_top); top = new_top; n++; } int Stack::pop() { Node* old_top = top; int ret_num = old_top->getData(); top = old_top->getNext(); delete old_top; n--; return ret_num; } inline int Stack::peek() { return top->getData(); } inline unsigned long int Stack::getSize() { return n; } void Stack::print() { Node* current = top; cout << "Stack: ["; for(unsigned long int i = 0; i<n-1; i++) { cout << current->getData() << ", "; current = current->getNext(); } cout << current->getData() << "]" << endl; } void Stack::empty() { unsigned long int upper = n; for(unsigned long int i = 0; i<upper; i++) { this->pop(); } } Stack createStackRange(int start, int end, int step = 1) { Stack stack = Stack(); for(int i = start; i <= end; i+=step) { stack.push(i); } return stack; } int main() { Stack s = createStackRange(0,5e6); cout << s.peek() << endl; sleep(1); cout << "emptying" <<endl; s.empty(); cout << "emptied" <<endl; cout << "The size of the stack is " << s.getSize()<<endl; cout << "waiting..." << endl; sleep(10); return 0; } //一个简单的基于链表的整数堆栈 #包括 使用名称空间std; 类节点 { 私人: int-num; 节点*下一步; 公众: 节点(int数据,节点*next); int getData(); 节点*getNext(); }; 节点::节点(int数据,节点*下一个节点) { num=数据; 下一个=下一个_节点; } 内联int节点::getData() { 返回num; } 内联节点*节点::getNext() { 下一步返回; } 类堆栈 { 私人: 无符号长整数n; 节点*顶部; 公众: 堆栈(int-first); 堆栈(); 无效推送(int数据); int-pop(); int peek(); 无符号长整型getSize(); 作废打印(); void empty(); }; 堆栈::堆栈(int优先) { 节点第一个\顶部(第一个,空); top=&first_top; n=1; } Stack::Stack() { top=NULL; n=0; } void Stack::push(int数据) { 节点*old_top=top; Node*new_top=新节点(数据,旧_top); 顶部=新的顶部; n++; } int Stack::pop() { 节点*old_top=top; int ret_num=old_top->getData(); top=old_top->getNext(); 删除旧的顶部; n--; 返回ret_num; } 内联int堆栈::peek() { 返回top->getData(); } 内联无符号长整型堆栈::getSize() { 返回n; } void Stack::print() { 节点*当前=顶部; cout

平凡堆栈实现中的内存泄漏 Python和java是我的经验,但我最近决定学习C++。我决定做一个快速的整数堆栈实现,但它有一个巨大的内存泄漏,我无法理解。当我弹出节点时,它似乎并没有释放内存,即使我在弹出时显式删除了旧节点。当我运行它时,它会使用150mb的内存,但在清空堆栈后不会释放任何内存。我将非常感谢任何帮助,因为这是我第一次尝试一种没有垃圾收集的语言。这是在64位Kubuntu上用GCC4.3编译的 //a trivial linked list based stack of integers #include <iostream> using namespace std; class Node { private: int num; Node * next; public: Node(int data, Node * next); int getData(); Node * getNext(); }; Node::Node(int data, Node * next_node) { num = data; next = next_node; } inline int Node::getData() { return num; } inline Node* Node::getNext() { return next; } class Stack { private: unsigned long int n; Node * top; public: Stack(int first); Stack(); void push(int data); int pop(); int peek(); unsigned long int getSize(); void print(); void empty(); }; Stack::Stack(int first) { Node first_top (first, NULL); top = &first_top; n = 1; } Stack::Stack() { top = NULL; n = 0; } void Stack::push(int data) { Node* old_top = top; Node* new_top = new Node(data,old_top); top = new_top; n++; } int Stack::pop() { Node* old_top = top; int ret_num = old_top->getData(); top = old_top->getNext(); delete old_top; n--; return ret_num; } inline int Stack::peek() { return top->getData(); } inline unsigned long int Stack::getSize() { return n; } void Stack::print() { Node* current = top; cout << "Stack: ["; for(unsigned long int i = 0; i<n-1; i++) { cout << current->getData() << ", "; current = current->getNext(); } cout << current->getData() << "]" << endl; } void Stack::empty() { unsigned long int upper = n; for(unsigned long int i = 0; i<upper; i++) { this->pop(); } } Stack createStackRange(int start, int end, int step = 1) { Stack stack = Stack(); for(int i = start; i <= end; i+=step) { stack.push(i); } return stack; } int main() { Stack s = createStackRange(0,5e6); cout << s.peek() << endl; sleep(1); cout << "emptying" <<endl; s.empty(); cout << "emptied" <<endl; cout << "The size of the stack is " << s.getSize()<<endl; cout << "waiting..." << endl; sleep(10); return 0; } //一个简单的基于链表的整数堆栈 #包括 使用名称空间std; 类节点 { 私人: int-num; 节点*下一步; 公众: 节点(int数据,节点*next); int getData(); 节点*getNext(); }; 节点::节点(int数据,节点*下一个节点) { num=数据; 下一个=下一个_节点; } 内联int节点::getData() { 返回num; } 内联节点*节点::getNext() { 下一步返回; } 类堆栈 { 私人: 无符号长整数n; 节点*顶部; 公众: 堆栈(int-first); 堆栈(); 无效推送(int数据); int-pop(); int peek(); 无符号长整型getSize(); 作废打印(); void empty(); }; 堆栈::堆栈(int优先) { 节点第一个\顶部(第一个,空); top=&first_top; n=1; } Stack::Stack() { top=NULL; n=0; } void Stack::push(int数据) { 节点*old_top=top; Node*new_top=新节点(数据,旧_top); 顶部=新的顶部; n++; } int Stack::pop() { 节点*old_top=top; int ret_num=old_top->getData(); top=old_top->getNext(); 删除旧的顶部; n--; 返回ret_num; } 内联int堆栈::peek() { 返回top->getData(); } 内联无符号长整型堆栈::getSize() { 返回n; } void Stack::print() { 节点*当前=顶部; cout,c++,memory-leaks,stack,C++,Memory Leaks,Stack,您如何知道内存没有被释放?运行库将管理分配,并且在程序终止之前可能不会将内存释放回操作系统。如果是这种情况,则在程序执行期间,内存将可用于程序内的其他分配 但是…你似乎还有其他问题。我的C++是生锈的,因为我做java已经15年了,但是在你的堆栈中::堆栈构造器,你在系统栈上分配一个节点实例,然后在你的“栈”中存储一个引用。。当构造函数结束时,该节点实例将超出作用域,留下一个悬空指针。您如何知道内存没有被释放?运行库将管理分配,并且在程序终止之前可能不会将内存释放回操作系统。如果是这种情况,内存

您如何知道内存没有被释放?运行库将管理分配,并且在程序终止之前可能不会将内存释放回操作系统。如果是这种情况,则在程序执行期间,内存将可用于程序内的其他分配


但是…你似乎还有其他问题。我的C++是生锈的,因为我做java已经15年了,但是在你的堆栈中::堆栈构造器,你在系统栈上分配一个节点实例,然后在你的“栈”中存储一个引用。。当构造函数结束时,该节点实例将超出作用域,留下一个悬空指针。

您如何知道内存没有被释放?运行库将管理分配,并且在程序终止之前可能不会将内存释放回操作系统。如果是这种情况,内存将可用于内部的其他分配您的程序在执行过程中

Stack::Stack(int first)
{
    Node first_top (first, NULL);
    top = &first_top;
    n = 1;
}

但是…你似乎还有其他问题。我的C++是生锈的,因为我做java已经15年了,但是在你的堆栈中::堆栈构造器,你在系统栈上分配一个节点实例,然后在你的“栈”中存储一个引用。。当构造函数结束时,该节点实例将超出作用域,留下一个悬空指针

Stack::Stack(int first)
{
    Node first_top (first, NULL);
    top = &first_top;
    n = 1;
}
这是错误的,您不能将本地对象的地址分配给类成员(顶部),因为当函数返回时,本地对象会被销毁

在堆上而不是堆栈上创建节点,执行以下操作:

 Stack::Stack(int first)
    {
        top = new Node(first, NULL);
        n = 1;
    }
并明确链接列表的概念,如果可以的话,使用钢笔和纸。

您的Stack::Push(int)操作似乎有问题,请检查您忘记执行的操作

我的建议是尝试在模板的帮助下实现泛型堆栈,这样它将适用于所有数据类型

这是错误的,您不能将本地对象的地址分配给类成员(顶部),因为当函数返回时,本地对象会被销毁

在堆上而不是堆栈上创建节点,执行以下操作:

 Stack::Stack(int first)
    {
        top = new Node(first, NULL);
        n = 1;
    }
并明确链接列表的概念,如果可以的话,使用钢笔和纸。

您的Stack::Push(int)操作似乎有问题,请检查您忘记执行的操作


我的建议是尝试在模板的帮助下实现泛型堆栈,这样它将适用于所有数据类型。

仔细研究代码后,我找不到漏洞,所以我自己编译并在调试器中运行了它。我同意Jim Garrision的观点-我认为你看到的是运行时的工件,而不是实际的漏洞,bec因为我看不到这一点。NickLarsen和smith指出的问题都是您想要纠正的实际问题,但是如果您跟踪代码,这两个问题实际上都不应该导致您描述的问题。您的示例中从未调用smith singles out的代码,Nick singles out的代码会导致其他问题,但不会在仔细研究代码之后,我找不到漏洞,所以我自己编译并在调试器中运行了它。我同意Jim Garrision的观点-我认为你看到的是运行时的一个工件,而不是一个实际的漏洞,因为我看不到它。NickLarsen和smith指出的问题都是实际问题您想更正的内容,但如果您跟踪代码,两者都不应实际导致您描述的问题。示例中从未调用smith singles out代码,Nick singles代码会导致其他问题,但不会导致您看到的问题。

When
createStackRange()
返回它将使用编译器生成的复制构造函数返回堆栈的一个副本,该构造函数只进行按位复制(即,它将指针复制到第一个节点和大小)

更严重的是,您缺少了
堆栈
类的析构函数。理想情况下,您可以让它遍历列表并在每个
节点上调用delete
。在处理器堆栈上创建的
堆栈
对象将自动清除