您好我通过valgrind运行我的程序,这是报告
堆摘要: 在退出时使用:1个块中的8个字节 总堆usag:1个allocs,0个frees,8个字节分配 泄漏摘要: 绝对丢失:1个块中的8个字节
这是我的程序
int main() {
NodeData nodedata1(1, 'a');
List list1;
list1.insert(&nodedata1);
return 0;
}
//---my List class
class List {
public:
List();
bool insert(NodeData*); // insert one Node into list
bool isEmpty() const;
private:
struct Node { // the node in a linked list
NodeData* data; // pointer to actual data, operations in NodeData
Node* next;
};
Node* head; // pointer to first node in list
};
// my bool insert method
bool List::insert(NodeData* rightPtr) {
Node* newPtr = new Node;
newPtr->data = rightPtr;
if (isEmpty() || *newPtr->data < *head->data) {
newPtr->next = head;
head = newPtr;
}
else {
Node* current = head;
while (current->next !=NULL && *current->next->data < *newPtr->data) {
current = current->next;
}
newPtr->next = current->next;
current->next = newPtr;
}
return true;
}
答案 0 :(得分:4)
通过声明它创建的对象将在其范围结束之前被销毁。除非您手动删除,否则不会销毁使用 new 创建的对象。以下示例演示了对象的生命周期。
#include <iostream>
using namespace std;
class Data {
protected:
char* name;
public:
Data(char* n) {
name = n;
cout << name << " is created." << endl;
}
~Data() {
cout << name << " is destroyed." << endl;
}
};
void ScopeDemo() {
Data obj1("Obj1");
Data* obj2 = new Data("Obj2");
}
int main()
{
ScopeDemo();
return 0;
}
在现代操作系统中,应用程序使用的内存将在应用程序终止时释放。
在您的示例中,当列表对象被销毁时(通过对象析构函数)以及从列表中删除节点时,您需要手动删除。
List::~List() {
if (!isEmpty()) {
Node* toDelete = head;
while(toDelete != NULL) {
Node* next = toDelete->next;
delete toDelete;
toDelete = next;
}
}
}
答案 1 :(得分:3)
您正在Node
方法中动态分配insert
,永不删除它:
Node* newPtr = new Node;
你需要跟踪这些Nodes
并在List
析构函数中删除它们,或者有一些其他的安排来处理内存(即将Nodes
的所有权传递给某些东西负责在适当的时候删除它们。)