问题出在我的赋值运算符中,我忘记为字符串类中的指针取消分配和重新分配内存。我一定不小心把它当作一个复制构造函数;这就是为什么内存管理非常重要的一个很好的教训。感谢大家的帮助。
香港专业教育学院实现了我自己的字符串类,这似乎是中断之前调用堆栈上的最后一个函数。
String::~String(){
delete [] rep;
len=0;
}
有人可以帮助我了解问题所在吗?
这是调用它的函数
template <class T>
void SList<T>::RemoveAfter(typename SList<T>::Iterator i){
assert(i.nodePointer !=0 && i.nodePointer->next!=0);
Node *save = i.nodePointer -> next;
i.nodePointer->next = i.nodePointer->next->next;
delete save;
}
如果有更多信息,您需要帮助我弄清楚为什么会发生,让我知道。
顺便说一句,如果我使用类型为int的话,那么我就不会遇到这个问题,所以我知道问题必须出在我的字符串类上……对吗?
根据要求提供更多信息:
struct Node{ // Node: Stores the next Node and the data.
T data;
Node *next;
Node() {next =0;}
Node(const T& a, Node *p = 0){data=a;next=p;}
};
错误:
中断的示例功能:
String item1("Example"), item2("Example");
SList<String> list1;
list1.AddFirst(item2);
list1.AddFirst(item1);
list1.AddLast("List Class");
list1.AddLast("Functionality");
SList<String>::Iterator i1;
i1 = list1.Begin();
i1++;
i1++;
list1.RemoveAfter(i1);
有效的例子
SList<int> list1;
list1.AddFirst(1);
list1.AddFirst(2);
list1.AddLast(3);
list1.AddLast(4);
SList<int>::Iterator i1;
i1 = list1.Begin();
i1++;
i1++;
list1.RemoveAfter(i1);
system("pause");
更多信息:
//Default Constructor
String::String(){
rep = new char[1];
rep[0] = '\0';
len = 0;
}
//Constructor - Converts char* to String object
String::String(const char *s){
len=0;
const char *temp = s;
while(*temp){
++len;
++temp;
}//Sets len of rep to the length of s
rep = new char[len + 1];
for(int i=0; i<=len; ++i)
rep[i]=s[i];
}
//Copy Constructor
String::String(const String &obj){
len=0;
char *temp = obj.rep;
while (*temp){
++len;
++temp;
}//Sets len of rep to length of obj.rep
rep = new char[len + 1];
for (int i = 0; i<=len; ++i)
rep[i] = obj.rep[i];
}
//Assignment operator
const String& String::operator=(const String &rhs){
if (this != &rhs){
len=0;
char *temp = rhs.rep;
while(*temp){
++len;
++temp;
}//Sets len of this to length of rhs.rep
for(int i = 0; i<=len;++i)
rep[i]=rhs.rep[i];
}
return *this;
}
最佳答案
在您的赋值运算符中,您可能正在char* rep
所指向的已分配区域的边界之外进行写操作,这可能会破坏堆栈(即,导致行为不确定)。
稍后当您尝试重新分配该段内存时,损坏的堆栈可能会导致事情变得无法正常运行,这很合理,这就是运行应用程序时收到错误消息的原因。
如消息本身所言:“这可能是由于堆的损坏所致”。
我该如何解决我的问题?
在您的赋值运算符内部,您将需要做三件事:
目前,您只执行第3步和第4步。
关于c++ - 我认为我的析构函数导致发生错误。你能帮我找出原因吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11495899/