首页 文章

检测到新的/删除堆损坏:CRT检测到应用程序在堆缓冲区结束后写入内存

提问于
浏览
0

在下面的代码片段中,我试图取消分配用于使用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;
}

我收到了以下错误 .

HEAP CORRUPTION DETECTED: after Normal block(#150) at 0x005B5380. CRT Detected that the application wrote to memory after end of heap buffer.

3 回答

  • -1

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

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

    也就是说,如果你坚持让生活变得更加困难并使用char数组,你应该检查你的代码是否真的符合你的要求:

    l_ptr1 = new char(256);
    

    这一行分配一个char并分配数字256 .

    l_ptr1 = new char[256];
    

    这一行分配256个字符 .

  • 3
    new char(256)
    

    分配单个字符,值为256(转换为 char 类型后) . 你把它当作一个数组,所以你可能意味着

    new char[256]
    

    它分配一个数组 .

    现在你的问题是,如果任何一个输入超过256的任意限制,程序就会爆炸 . 最好使用 std::string 表示一个字符串,而不是试图自己处理原始内存 .

  • 9

    您应该使用以下删除

    delete l_ptr1;
    delete l_ptr2;
    

    不是 [] ,因为您使用 new 而不是 new [] 进行了分配 .

    new char(256) 将分配一个 char 并初始化它将为256 .

    要么

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

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

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

相关问题