我搞砸了我已经浏览了一段时间的编程书籍中的一些 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;
}
所以,正如@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");
}
}