我把一本编程书上的一些C练习搞混了,我已经看了一段时间了。我的任务是实现一个线性数据结构,当最后一次插入使其充满时,它会将自身的大小扩展两倍。我知道有一种方法可以解决这个问题,即创建一个临时数组来复制值并将其传输回原始的起始数组。然而,我很想探索malloc
realloc
的内存管理,因为我对如何更深入地控制内存很好奇,我的计划是扩展练习的解决方案,动态地收缩数组,以相反的方式应用概念。也就是说,我可以使用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;
}
1条答案
按热度按时间xuo3flqw1#
所以,我肯定是在移动指针内存重新分配,就像@RetiredNinja在他/她的评论中所说的那样。这里学到的教训是更好地重现问题,而不是仅仅把第一次猜测作为问题背后的原因:)