C++ heap corrupt
C++ heap corrupt
int main()
{
int a = 3;
int arr[] = { 5, 3, 6 };
Vect v(a, arr);
v.add(1);
v.add(2);
v.add(3);
v.add(4);
return 0;
}
Vect
class:
int n;
int* ptr = new int[n];
构造函数:Vect(int nInit, int arr[])
{
n = nInit;
for (int i = 0; i < n; i++)
{
ptr[i] = tab[i];
}
}
add method in Vect
class:
void add(int value)
{
n += 1;
ptr[n-1] = value;
}
我得到错误Program.exe has triggered a breakpoint.
atmsvcr120d.dll!_heap_alloc_base(unsigned int size) Line 58
。我也试过使用memcpy
.
有趣的是,当我只调用add
一次或两次,或者在arr
数组中只发送一个int
时,一切都很好。
这里可能出了什么问题?
问题的主要来源是:
void add(int value)
{
n += 1;
ptr[n-1] = value; // Danger !!!!
}
使用new创建大小为'n'的内存 int* ptr = new int[n];
但是在函数void add(int value)中,您试图将数字存储在超出分配内存的位置(问题)。
方案1:
如果你已经知道你想要在内存中存储的最大数字是多少,那么首先使用new分配那么多的内存,然后在分配的大小内执行任意数量的存储。
解决方案2:
如果你想存储比你最初分配的更多的数据,那么使用下面的函数分配一个新的内存(注意:将旧的内容复制到新的内存中,并在使用后删除旧的/新分配的内存,以避免内存泄漏。)
void Vect::resize(int newSize ) {
int* newArr = new int[newSize];
memcpy( newArr, ptr, n * sizeof(int) );
n = newSize;
delete [] ptr;
ptr = newArr;
}
您需要检查n是否小于分配内存时使用的值。
void add(int value)
{
// add logic to check your n is less than used while allocating.
//if(n < N)
n += 1;
ptr[n-1] = value;
}
在方法add
中增加n
。但是n
仅仅是您过去分配了多少内存的指示器(在tor中)。你现在要做的就是增加指示值假装数组变大了。但是你没有扩大数组。所以你是在数组外写入新值,因此出现了异常。
如果你想添加一个元素到你的数组中,你必须:
- 分配第二个数组,比第一个数组大
- 将第一个单元格的内容复制到第二个单元格(这将使第二个单元格的最后一个单元格保持不变) 交换这些数组,所以现在
-
delete
旧数组 - 最后将新的int赋值到第二个 的最后一个单元格
ptr
将指向新的/edit:构造函数也是如此。如果我正确理解你的代码,并且n
指示数组的大小,那么在给定的方法中,如果没有ptr = new int[n];
,你永远不能触摸n
。
相关文章:
- 为什么我的 heap.h 文件给我一个LNK2001错误?
- 当为可变性配置时,boost::heap::d_ary_heap 保留的额外 std::list 的目的是什么?
- 了解 Linux 虚拟内存:valgrind 的 massif 输出显示了有和没有 --pages-as-heap 的主要差异
- 堆叠协程 + gdb = "previous frame inner to this frame (corrupt stack)?"
- 从 MSVC14 切换到 MSVC16 会导致"compiler is out of heap space (C1060)"错误
- 庞大的初始化列表,如何修复"fatal error C1060: compiler is out of heap space"
- 在析构函数中调用"delete"运算符时"compiler is out of heap space"编译器错误
- 在 boost::heap::p riority_queue 中推送结构对象时出错
- QCoreApplication on the heap
- 用于创建Min-Heap的算法
- "D3D12 CORRUPT: ID3D12CommandList::CopyResource: pDstResource is corrupt."我是如何损坏着色器资源视图的缓冲区的?
- 为什么这段代码会导致"heap corruption detected"?
- Min-Heap,基于零的数组C
- STL for Fibonacci Heap?
- Windows heap corruption C++C
- C 将HEAP对象插入std ::用insert()插入映射,而另一个则存在删除新的对象
- 在windbg中"!heap -h"输出中"Internal"的含义是什么?
- OpenCV HOGDescriptor HEAP crash
- c++ cleaning the heap
- C++ heap corrupt