c++ 重新分配模板值抛出__GI__引发异常队列,类似于数组实现练习

58wvjzkj  于 2023-03-10  发布在  其他
关注(0)|答案(1)|浏览(111)

我把一本编程书上的一些C练习搞混了,我已经看了一段时间了。我的任务是实现一个线性数据结构,当最后一次插入使其充满时,它会将自身的大小扩展两倍。我知道有一种方法可以解决这个问题,即创建一个临时数组来复制值并将其传输回原始的起始数组。然而,我很想探索mallocrealloc的内存管理,因为我对如何更深入地控制内存很好奇,我的计划是扩展练习的解决方案,动态地收缩数组,以相反的方式应用概念。也就是说,我可以使用malloc有效地存储我的模板值,但不幸的是,我无法使用realloc来使类似数组的结构更大。当在Vim上从Termdebug使用gdb进行调试时,出现了__GI__ raise异常。坦率地说,我不知道这意味着什么,因为它指出了一个.c文件,我不知道任何事情。
只是为了确定这个问题与模板值密切相关。我用int做了一个小测试,检查编译器是否有什么奇怪的事情发生。
我有一种感觉,c
在运行时处理模板和处理原始值是不同的,但这只是一种猜测。
有人能指出我错过了什么吗?有什么概念/阅读/文章/材料我应该学习吗?
干杯!

/* Implement the structure "Circular Queue" with array, which doubles its capacity when it's 
 * full. Implement the necessary methods for adding, removing the element in succesion
 * and retrieving without removing the element in succession. If an operation is invalid,
 * throw an appropriate exception.*/

#include <cstdlib>
#include <cstddef>
#include <iostream>
#include <string>
#include <array>

template <typename TValue>
class CQueue {
  public:
    CQueue();
    ~CQueue(); 
    void add(TValue data);
  private:
    size_t size = 1;
    TValue* array; 
};
template<typename TValue>
CQueue<TValue>::CQueue(){
  array = (TValue*) malloc(sizeof(TValue));
}

template<typename TValue>
CQueue<TValue>::~CQueue(){}

template<typename TValue>
void CQueue<TValue>::add(TValue data){
  if (*array == array[size-1]) {
    TValue* extend = NULL;
    extend = (TValue*)realloc(array, size*sizeof(TValue));
    if (extend!=NULL) {
      array = extend; 
      ++array;
    }else {
      free(array);
      puts("Error reallocation memory");
    }
  }
  *array = data;
}

int main(){
  CQueue<std::string>test; 
  test.add("data");
  test.add("Mafalda");
  test.add("lol");
  return 0;
}
xuo3flqw

xuo3flqw1#

所以,我肯定是在移动指针内存重新分配,就像@RetiredNinja在他/她的评论中所说的那样。这里学到的教训是更好地重现问题,而不是仅仅把第一次猜测作为问题背后的原因:)

template<typename TValue>
void CQueue<TValue>::expand(){
  TValue* extend = NULL;
  extend = (TValue*)realloc(array, size*sizeof(TValue));
  if (extend!=NULL) {
    array = extend; 
  }else {
    free(array);
    puts("Error reallocation memory");
  }
}

相关问题