列出类实现 带有指针的内存分配错误
List Class implementation Memory allocation error with a pointer
所以我试图做一个List类的实现,但是当试图做擦除功能时,我不断得到一个指针被释放没有分配错误。
这是我的函数 erase() 的代码:
template <class T> void List<T>::erase(ListIterator<T> & start, ListIterator<T> & stop)
{
while (start<= stop) {
ListIterator<T> * temp = &start;
++temp;
delete start.currentLink;
start.currentLink = temp->currentLink;
}
}
现在我已经测试了我的链接和列表类,它们可以工作,我已经完成了其他所有工作,如 insert() 和 push_back()。我无法找出内存分配出错的地方。是否有任何想法可以指出我正确的方向。
根据您的实现,您将在 while 循环的第三次迭代中释放相同的内存空间(即,如果您要释放超过 2 个元素,那么您可能会收到错误)。
template <class T> void List<T>::erase(ListIterator<T> & start, ListIterator<T> & stop)
{
while (start<= stop) {
ListIterator<T> * temp = &start;
Line:1 ++temp;
Line:2 delete start.currentLink;
Line:3 start.currentLink = temp->currentLink;
}
}
考虑 ListClass = {A, B, C},其中 A.link = 100,B.link = 101,C.link = 102
第一次迭代:
第 1 行:温度指向 B
第2行:您免费100
第 3 行:您分配 A.link = temp.link (即 B.link) = 101
第二次迭代:
第 1 行:温度仍指向 B
2号线:你免费 101
第 3 行:您分配 A.link = temp.link (即 B.link) = 101 已经释放
第三次迭代
第 1 行:温度仍然指向相同的的 B
第 2 行:您释放了已经释放的 101 <---可能 gdb 在这里抱怨
轻松修复:
template <class T> void List<T>::erase(ListIterator<T> & start, ListIterator<T> & stop)
{
ListIterator<T> * temp = &start;
while (start<= stop) {
++temp;
delete start.currentLink;
start.currentLink = temp->currentLink;
}
}
更好的修复:
template <class T> void List<T>::erase(ListIterator<T> & start, ListIterator<T> & stop)
{
ListIterator<T> * temp = &start;
while (start<= stop) {
delete start.currentLink;
start++;
}
temp->currentLink = start.currentLink;
}
虽然我对擦除功能感到困惑,因为最后 2 个元素将具有相同的当前链接(据我从您的实现中猜到)。
希望这有帮助。
相关文章:
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配