由于新()或malloc,内存泄漏
Memory leak because of new() or malloc
我正在尝试实现常规连续动态阵列的替代方案,在那里我使用的是指针的向量,每个阵列都指向一个常数大小数组,称其为xvector。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
对于一定的输入限制(例如150个元素(,它可以正常工作,但是除此之外,它开始抛出异常。
我尝试使用"新和删除"而不是" malloc and free",它确实增加了极限 - 说约1200个元素 - 但仍然存在相同的问题。
我正在使用C 。
这是我的主要程序:
XVector<int> xv;
for(int i=0;i<1210;i++){
int temp = rand()%100;
xv.pushBack(temp);
}
for(int i=0;i<xv.size();i++){
cout<<xv.getValue(i)<<" ";
}
cout<<"nn"<<xv.capacity();
return 0;
这是xvector(thed标头文件的类:
private:
const int b = 10;
vector<T*> arr;
int currentIndex;
int maxSize;
protected:
void expand(){
T* temp = new T[b];
arr.push_back(temp);
maxSize+=(b);
}
void shrink(){
delete[] arr[arr.size()-1];
arr[arr.size()-1] = NULL;
arr.pop_back();
maxSize-=(b);
}
int ceil(float num) {
int inum = (int)num;
if (num == (float)inum) {
return inum;
}
return inum + 1;
}
pair<int,int> position(int index){
pair<int,int> pos;
float result = ((float)index/b);
pos.first = result; //Row #
pos.second = ceil((result - pos.first)*b); //Exact cell in the row
return pos;
}
public:
XVector(){
currentIndex=0;
maxSize=b;
arr.reserve(120);
arr.push_back(new T[b]);
}
void pushBack(T value){
if(currentIndex>=maxSize-1){expand();}
pair<int,int> indeces = position(currentIndex);
arr[indeces.first][indeces.second]=value;
currentIndex++;
}
void popBack(){
currentIndex--;
if(maxSize>=currentIndex+(2*b)){shrink();}
}
T getValue(int index){
pair<int,int> indeces = position(index);
return arr[indeces.first][indeces.second];
}
void setValue(int index,T value){
pair<int,int> indeces = position(index);
arr[indeces.first][indeces.second] = value;
}
int capacity(){
return maxSize;
}
int size(){
return currentIndex;
}
bool empty(){
return currentIndex==0?true:false;
}
ps:我尝试使用valgrind,但无法识别确切的问题。
您的程序会泄漏内存,因为您永远不会释放毁灭者中的指针。您必须实现驱动器来求解内存泄漏(除了移动构造函数,复制构造函数,分配副本和作业移动(。
除Valgrind外,您还可以使用ASAN,它具有更好的输出且运行速度更快。
导致代码崩溃的代码的主要问题不是内存泄漏。完全记忆泄漏不会在短期内崩溃。在内存泄漏案例中,您的应用程序可以正常工作,直到RAM上有足够的空间,然后如果您的RAM已满,则会发生崩溃。您在 position((方法中犯了一个错误。
例如,当您调用位置(索引:29(时,由于float的实现和float Precision的结果(结果-os.first(*B is 9.00000095 。这意味着其结果与实际结果有一点差异(9(。然后您致电 CEIL(9.00000095(,结果返回10。这意味着您可以访问第二维索引10,而您可以使用0到9的索引,并且您的索引范围不超出范围访问,从而导致您在一段时间后崩溃,并且您的程序可能具有未定义的行为。
正确的位置方法样本是:
pair<int, int> position(int index){
pair<int, int> pos;
float result = ((float)index / b);
pos.first = result; //Row #
pos.second = index%b; // changed line
return pos;
}
最后,您应该定义驱动器并删除由新操作员分配的所有记忆。所有向量元素(数组(都需要删除。
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏