所以我有这个链表类在功能上做得很好,但是当涉及到实际的内存使用(泄漏,到处泄漏)时非常恶心。
所以我要在其中实现一个基本的智能指针类,以便更好地处理内存,但是我在这个想法的实际实现部分遇到了一些粗略的观点。
我只是明确地包含了我认为与该问题相关的内容,但是,如果没有包含可能证明有用的任何部分,请询问并且我可以发布整个事情。
main.cpp中:
int main()
{
smartLinkedList<char*> moo2;
moo2.insertAtFront("tail");
moo2.insertAtFront("one");
moo2.insertAtFront("head");
for(int j = 0; j < moo2.length() ; j++)
cout << moo2.goToFromFront(j) << endl;
cin.ignore(1);
return 0;
}
smartLinkedList.h:
template <class type>
class smartLinkedList
{
private:
int size;
sPtr<node<type>> head;
public:
smartLinkedList(): head(NULL), size(0) {}
bool insertAtFront(type obj)
{
sPtr<node<type>> temp(new node<type>);
temp->data = obj;
temp->next = head.get();
//For future reference, &*head = head.get()
head = temp;
//delete temp;
size++;
return true;
}
type goToFromFront(int index)
{
sPtr<node<type>> temp = head;
for(int i = 0; i < index; i++)
{
temp = temp->next;
if(temp->next == NULL)
return temp->data;
}
return temp->data;
}
};
smartPointer.h:
#pragma once
class referenceCount
{
private:
int count;
public:
void add()
{
count++;
}
int release()
{
return --count;
}
};
//for non-learning purposes, boost has a good smart pointer
template <class type>
class sPtr
{
private:
type *p;
referenceCount *r;
public:
sPtr()
{
p = NULL;
r = new referenceCount();
r->add();
}
sPtr(type *pValue)
{
p = pValue;
r = new referenceCount();
r->add();
}
sPtr(const sPtr<type> & sp)
{
p = sp.p;
r = sp.r;
r->add();
}
~sPtr()
{
if(r->release() == 0)
{
delete p;
delete r;
}
}
type* get()
{
return p;
}
type& operator*()
{
return *p;
}
type* operator->()
{
return p;
}
sPtr<type>& operator=(const sPtr<type>& sp)
{
if (this != &sp) //self assignment
{
/*if(r->release() == 0)
{
delete p;
delete r;
}*/ //this will cause an error when you take something with no references and set it equal to something
p = sp.p;
r = sp.r;
r->add();
}
return *this;
}
};
node.h:
#pragma once
template <class type>
struct node
{
type data;
node *next;
node()
{
next = NULL;
}
};
从链表的goToFromFront(int)中的if语句中专门抛出“无法从0xfdfdfe01读取”的行,其中,在主循环中的j = 2处抛出错误。在查看MSVS2010调试器时,temp-&gt; next是未知的(CXX0030:错误,表达式无法评估),这对我来说似乎应该转换为null,但表达式首先抛出一个无法读取的错误。
我不确定我做错了什么,因为这对我来说都是一个学习过程,所以任何批评都会受到高度赞赏。提前谢谢!
答案 0 :(得分:0)
这些应该可以解决您的问题:
取消注释operator = of sPtr中的代码或使用swap idiom:
sPtr<type>& operator=(const sPtr<type>& rhs)
{
if (this != &rhs) // self assignment
{
sPtr<type> tmp(rhs);
std::swap(this->p, tmp.p);
std::swap(this->r, tmp.r);
}
return *this;
}
template <class T>
class node
{
public:
T data;
sPtr<node<T> > next;
};
bool insertAtFront(type obj)
{
sPtr<node<type>> temp(new node<type>);
temp->data = obj;
temp->next = head;
head = temp;
size++;
return true;
}
在goToFromFront中,'temp = temp-&gt; next;'使用temp-&gt; next创建了一个refCount。 当'temp'超出范围时,它会破坏其内容,因此'head-&gt; next'指向垃圾。
当你做sPtr&gt; = T *,隐式创建临时对象 您可以将sTtr构造函数声明为:
explicit sPtr(type *pValue)