C++ 删除数组时检测到堆损坏
C++ Heap Corruption Detected While Deleting Array
我一直在尝试制作的 DynamicStack 的 pop() 函数中收到堆损坏错误。
现在我已经设置了它,如果项目数量小于我之前设置的容量的 1/4 左右,那么 DynamicStack 的大小将减半(除非新的减半容量小于我的原始容量)。
我得到的确切错误(使用 Visual C++)是:
检测到堆损坏:在0x010AF0D0正常块(154 美元)之后。 CRT 检测到应用程序在堆缓冲区结束后写入内存
StackItem DynamicStack::pop()
{
if (size_ == 0)
return EMPTY_STACK;
StackItem thingToReturn = items_[size_ - 1]; // The item to return is at location size - 1
size_--;
if ((size_ <= capacity_ * (1.0 / 4)) && capacity_ / 2 >= init_capacity_)
{
StackItem * items_half = new StackItem[capacity_ / 2];
for (int i = 0; i < size_; i++)
items_half[i] = items_[i];
capacity_ = capacity_ / 2;
delete[] items_; // ERROR IS HERE
items_ = items_half;
}
return thingToReturn;
}
这也是我为这个堆栈制作的推送函数
void DynamicStack::push(StackItem value)
{
if (size_ != capacity_)
items_[size_] = value;
else
{
StackItem * items_new = new StackItem[capacity_ * 2];
for (int i = 0; i < capacity_; i++)
items_new[i] = items_[i];
items_new[capacity_] = value;
capacity_ = capacity_ * 2;
delete[] items_;
items_ = items_new;
}
size_++;
}
这是动态堆栈的默认构造函数 其中 items_、capacity_、size_ 和 init_capacity_ 的类型为 int。
DynamicStack::DynamicStack()
{
items_ = new StackItem[16];
capacity_ = 16;
size_ = 0;
init_capacity_ = 16;
}
这是我正在运行的导致堆缓冲区错误的测试:
bool test3()
{
DynamicStack stack(24);
stack.push(10);
stack.push(20);
ASSERT_TRUE(stack.peek() == 20)
ASSERT_TRUE(stack.pop() == 20)
ASSERT_TRUE(stack.pop() == 10)
ASSERT_TRUE(stack.pop() == DynamicStack::EMPTY_STACK)
ASSERT_TRUE(stack.peek() == DynamicStack::EMPTY_STACK)
return true;
}
总的来说,我使用默认初始化运行测试。
int main()
{
DynamicStackTest stack_test;
bool stack_test3_passed = stack_test.test3();
cout << "---Dynamic Stack Tests---" << endl;
cout << "Test3: " << get_status_str(stack_test3_passed) << endl;
}
我希望编译时不应该有任何错误,因为 delete[] 真的不需要任何内存分配吧?如果存在某些内容,删除它应该没有问题。
所以这个答案其实很尴尬。我在 DynamicStack.cpp 中将capacity_标记为容量,基本上这搞砸了构造函数。
相关文章:
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- 删除字符串后C++检测到堆损坏
- 检测到堆损坏(字符串导致堆损坏)|C++
- 在C++中检测到堆损坏错误
- C++ 内存损坏检测
- 如何修复检测到堆损坏:正常阻止后
- 在复制 delete[] 数组后在 C++ 中检测到堆损坏
- 从检测到 glibc 正常退出 - malloc():内存损坏
- 编译器如何检测内存损坏
- 排序程序的错误(检测到堆损坏)
- 正常块错误后检测到的堆损坏
- C++ 删除数组时检测到堆损坏
- 调试错误,在C++中检测到堆损坏
- 检测到堆损坏(类方法)
- 在普通块(#164)之后检测到堆损坏
- jemalloc未检测到内存损坏
- 检测到合并排序堆损坏
- 堆损坏检测(模拟动态数组与静态数组)
- 堆损坏检测:在正常块之后(#153)
- QwtPlot - 堆损坏检测