在下面的代码片段中,我试图取消分配用于使用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:正常阻止(#150)后的0x005B5380。 CRT检测到应用程序在堆缓冲区结束后写入内存。
答案 0 :(得分:9)
首先让我引用一位程序员,我从中学到了很多东西:
您的C ++代码包含一个错误:您没有使用std :: string。
也就是说,如果你坚持让生活变得更加困难并且使用char数组,你应该检查你的代码是否真的符合你的要求:
l_ptr1 = new char(256);
此行正在分配单个字符并指定数字256。
l_ptr1 = new char[256];
此行分配256个字符。
答案 1 :(得分:3)
new char(256)
分配单个字符,值为256(转换为char
类型后)。你把它当作一个数组,所以你可能意味着
new char[256]
分配一个数组。
现在你的问题是,如果任一输入超过你的任意限制256,程序就会爆炸。使用std::string
表示字符串更好,而不是试图自己处理原始内存
答案 2 :(得分:-1)
您应该使用以下内容进行删除
delete l_ptr1;
delete l_ptr2;
不是[]
,因为您使用new
而不是new []
进行了分配。
new char(256)
将分配一个char
并初始化为256。
或者
我认为你想要分配字符数组,因此
l_ptr1 = new char[256];
l_ptr2 = new char[256];
使用new []
运算符进行分配。