【问题标题】:NEW/Delete Heap Corruption Detected : CRT detected that the application wrote to memory after end of heap buffer检测到新/删除堆损坏:CRT 检测到应用程序在堆缓冲区结束后写入内存
【发布时间】:2015-01-27 07:42:13
【问题描述】:

在下面的 sn-p 中,我尝试使用 New 取消分配用于创建 Set 的动态内存,但在擦除 SET 的节点之后,如果我尝试删除。

#include <iostream>
#include <set>
#include <string>

using namespace std;

int main()
{
    std::set<char *> myset;
    std::set<char *>::iterator it;  
    char *l_ptr1, *l_ptr2;

    std::cout <<"Before Insertion::Address of myset " << &myset<<endl;
    //l_ptr1 = (char*)malloc(256*sizeof(char*));    
    //l_ptr2 = (char*)malloc(256*sizeof(char*));
    l_ptr1 = new char(256);
    l_ptr2 = new char(256);
    printf("Before Insertion ::Address of l_ptr1 %x\n", l_ptr1);
    printf("Before Insertion ::Address of l_ptr2 %x\n", l_ptr2);

    std::cin>>l_ptr1;
    myset.insert(l_ptr1);
    std::cin>>l_ptr2;
    myset.insert(l_ptr2);
    std::cout <<"After Insertion::Address of myset " << &myset<<endl;

    std::cout << "Myset Contains :: Value and It's Address "<<endl;
    it = myset.begin(); 
    std::cout<<*it<<"\t"<<&(*it)<<endl; ++it;
    std::cout<<*it<<"\t"<<&(*it)<<endl;
    std::cout << endl;

    it = myset.begin();
    myset.erase(it++);
    std::cout <<"After First Node Deletion ::Address of myset " << &myset<<endl;
    std::cout <<"Before free(l_ptr1) :: l_ptr1:: " <<l_ptr1 <<endl;
    //free(l_ptr1);
    delete[] l_ptr1;
    std::cout <<"After free(l_ptr1)  :: l_ptr1:: " <<l_ptr1 <<endl;
    myset.erase(it);
    std::cout <<"After Second Node Deletion ::Address of myset " << &myset<<endl;   
    std::cout <<"Before free(l_ptr2) :: l_ptr2:: " <<l_ptr2 <<endl;
    //free(l_ptr2);
    delete[] l_ptr2;
    std::cout <<"After  free(l_ptr2) :: l_ptr2:: " <<l_ptr2 <<endl;

    printf("After All Node Deletion ::Address of l_ptr1 %x\n", l_ptr1);
    printf("After All Node Deletion ::Address of l_ptr2 %x\n", l_ptr2);

    return 0;
}   

我收到以下错误。

检测到堆损坏:在 0x005B5380 的正常块 (#150) 之后。 CRT 检测到应用程序在堆缓冲区结束后写入内存。

【问题讨论】:

  • new char(256); -> new char[256];,您还需要修复您的 printf 格式。 打开编译器警告.

标签: c++ memory delete-operator


【解决方案1】:

首先让我引用一位我从中学到很多东西的程序员:

您的 C++ 代码包含一个错误:您没有使用 std::string。

也就是说,如果您坚持让生活更艰难并使用 char 数组,您应该检查您的代码是否真的按照您的意愿行事:

l_ptr1 = new char(256);

这一行正在分配单个字符并分配数字256。

l_ptr1 = new char[256];

这一行分配了 256 个字符。

【讨论】:

    【解决方案2】:
    new char(256)
    

    分配单个字符,其值为 256(转换为char 类型后)。你把它当作一个数组,所以你的意思可能是

    new char[256]
    

    分配一个数组。

    现在您的问题是,如果任一输入长度超过您的任意限制 256,程序将会爆炸。最好使用std::string 来表示字符串,而不是尝试自己处理原始内存。

    【讨论】:

      【解决方案3】:

      您应该使用以下内容进行删除

      delete l_ptr1;
      delete l_ptr2;
      

      不是[],因为您使用new而不是new []分配。

      new char(256) 将分配一个char 并将其初始化为256。

      或者

      我认为你想分配字符数组,因此

      l_ptr1 = new char[256];
      l_ptr2 = new char[256];
      

      使用new [] 运算符进行分配。

      【讨论】:

      • 我不能赞成这个。虽然它实际上是正确的,但它有点误导,因为你从一个错误的前提开始,给出错误的建议,然后在你意识到需要改变的是 new 而不是 delete 时,只纠正了一半.
      • 这太可怕了,而且是废话,请不要向任何人推荐new[]。
      猜你喜欢
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多