关于new和delete,程序编译没问题,运行时报错

hyykkk 2016-09-09 10:36:19
加精
int main(){
int n;
while(cin>>n){
char *p=new char;
_itoa(n,p,2);
string s(p);
cout<<s<<endl;
delete p;
}
}

...全文
2671 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
liulilittle 2018-06-05
  • 打赏
  • 举报
回复 1
引用 楼主 hyykkk 的回复:
int main(){ int n;
while(cin>>n){ char *p=new char; _itoa(n,p,2); string s(p); cout<<s<<endl; delete p; } }
char *p=new char; _itoa(n,p,2); 因为上述两句话造成了 new分配的内存左右两部分关键帧被破坏掉了 delete时会检查首指针向前的几个关键帧从中提取相关的信息 然后在 检测尾部几个关键字节,两个步骤中任何一个检测失败delete都将抛 出异常,这种问题几乎可以肯定程序在访问分配的堆内存出现了越界 否则不可能出现此类问题。 _itoa(n,p,2); 把n转换成字符串并且填充到p,但n的值远远超出 了p的容量,但它还是向p写入了超出的值,它可能不会出现异常 这是由于尾部可被读写的字节刚好满足,但却因此造成了尾部的关 键帧被破坏。 另一个关键的一点是,C/C++种char类型在内存中只占用一个字节 与dotNET不同。 一个好的办法是为p分配足够大的空间,一般情况下分配64+1个字 节 它几乎可以应对足够大范围的数值。 例如: int main(){ int n; while(cin>>n){ char *p=new char[64+1]; _itoa(n,p,2); cout<<p<<endl; delete[] p; } }
qq_42341487 2018-05-30
  • 打赏
  • 举报
回复
有大佬告诉我怎么破解防盗链吗
赵4老师 2016-09-12
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
int main() {
    int i,v;
    char bs[33];
    char b[33];
    char hs[9];
    char h[9];
    char s[4];
    char *e;

// 十进制整数转二进制串;
    i=1024;
    ltoa(i,b,2);
    sprintf(bs,"%032s",b);
    printf("i=%d,bs=%s\n",i,bs);
// 十进制整数转十六进制串;
    i=1024;
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("i=%d,hs=%s\n",i,hs);
// 十六进制字符串转成十进制数
    strcpy(hs,"00000400");
    sscanf(hs,"%x",&i);
    printf("hs=%s,i=%d\n",hs,i);
// 二进制字符串转化为十六进制字符串;
    strcpy(bs,"00000000000000000000010000000000");
    i=strtol(bs,&e,2);
    ltoa(i,h,16);
    sprintf(hs,"%08s",h);
    printf("bs=%s,hs=%s\n",bs,hs);
// 二进制字符串转化为十进制数;
    strcpy(bs,"00000000000000000000010000000000");
    i=strtol(bs,&e,2);
    printf("bs=%s,i=%d\n",bs,i);
// 十六进制字符串转成二进制串
    strcpy(hs,"00000400");
    sscanf(hs,"%x",&i);
    ltoa(i,b,2);
    sprintf(bs,"%032s",b);
    printf("hs=%s,bs=%s\n",hs,bs);
// ASC\GBK字符串转十六进制串
    strcpy(s,"a汉");
    i=0;
    while (1) {
        if (0==s[i]) break;
        sprintf(hs+i*2,"%02X",(unsigned char)s[i]);
        i++;
    }
    setlocale(LC_ALL,"chs");
    printf("s=%s,hs=%s\n",s,hs);
// 十六进制字符串转成汉字(GBK)及字符(ASC)
    strcpy(hs,"61BABA");
    i=0;
    while (1) {
        if (1!=sscanf(hs+i*2,"%2x",&v)) break;
        s[i]=(char)v;
        i++;
    }
    s[i]=0;
    printf("hs=%s,s=%s\n",hs,s);

    return 0;

}
//i=1024,bs=00000000000000000000010000000000
//i=1024,hs=00000400
//hs=00000400,i=1024
//bs=00000000000000000000010000000000,hs=00000400
//bs=00000000000000000000010000000000,i=1024
//hs=00000400,bs=00000000000000000000010000000000
//s=a汉,hs=61BABA
//hs=61BABA,s=a汉
paschen 版主 2016-09-10
  • 打赏
  • 举报
回复
可以参考:http://www.cnblogs.com/keanuyaoo/p/3297178.html
paschen 版主 2016-09-10
  • 打赏
  • 举报
回复
引用 13 楼 hyykkk的回复:
[quote=引用 12 楼 paschen 的回复:] [quote=引用 9 楼 hyykkk的回复:][quote=引用 8 楼 paschen 的回复:] 分配的堆内存使用时越界了,导致堆空间破坏,释放时出错 用new[] delete[]分配足够大小的空间
为什么不加delete p 程序就能运行 再请教一个问题: 请问c++有什么好的将16进制字符串转换为2进制字符串的方法么 为什么用cout<<setbase(2)<<number 输出的还是10进制形式[/quote] 依次遍历每个字符,替换成一个4位的二进制,总共十六种情况,一一列出来就行[/quote] 再请教一下 十进制字符串怎么转换2进制 这时候一个字符不是对应一个固定长度的二进制了 谢谢[/quote] 先转换成十进制数值,再得到对应二进制字符串
hyykkk 2016-09-10
  • 打赏
  • 举报
回复
引用 12 楼 paschen 的回复:
[quote=引用 9 楼 hyykkk的回复:][quote=引用 8 楼 paschen 的回复:] 分配的堆内存使用时越界了,导致堆空间破坏,释放时出错 用new[] delete[]分配足够大小的空间
为什么不加delete p 程序就能运行 再请教一个问题: 请问c++有什么好的将16进制字符串转换为2进制字符串的方法么 为什么用cout<<setbase(2)<<number 输出的还是10进制形式[/quote] 依次遍历每个字符,替换成一个4位的二进制,总共十六种情况,一一列出来就行[/quote] 再请教一下 十进制字符串怎么转换2进制 这时候一个字符不是对应一个固定长度的二进制了 谢谢
paschen 版主 2016-09-10
  • 打赏
  • 举报
回复
引用 9 楼 hyykkk的回复:
[quote=引用 8 楼 paschen 的回复:] 分配的堆内存使用时越界了,导致堆空间破坏,释放时出错 用new[] delete[]分配足够大小的空间
为什么不加delete p 程序就能运行 再请教一个问题: 请问c++有什么好的将16进制字符串转换为2进制字符串的方法么 为什么用cout<<setbase(2)<<number 输出的还是10进制形式[/quote] 依次遍历每个字符,替换成一个4位的二进制,总共十六种情况,一一列出来就行
paschen 版主 2016-09-10
  • 打赏
  • 举报
回复
引用 9 楼 hyykkk的回复:
[quote=引用 8 楼 paschen 的回复:] 分配的堆内存使用时越界了,导致堆空间破坏,释放时出错 用new[] delete[]分配足够大小的空间
为什么不加delete p 程序就能运行 再请教一个问题: 请问c++有什么好的将16进制字符串转换为2进制字符串的方法么 为什么用cout<<setbase(2)<<number 输出的还是10进制形式[/quote] the value 16 sets basefield to std::ios_base::hex the value 8 sets std::ios_base::oct the value 10 sets std::ios_base::dec. Values of base other than 8, 10, or 16 reset basefield to zero, which corresponds to decimal output and prefix-dependent input. setbase有效参数只是 16 8 10 http://en.cppreference.com/w/cpp/io/manip/setbase
paschen 版主 2016-09-10
  • 打赏
  • 举报
回复
引用 9 楼 hyykkk的回复:
[quote=引用 8 楼 paschen 的回复:] 分配的堆内存使用时越界了,导致堆空间破坏,释放时出错 用new[] delete[]分配足够大小的空间
为什么不加delete p 程序就能运行 再请教一个问题: 请问c++有什么好的将16进制字符串转换为2进制字符串的方法么 为什么用cout<<setbase(2)<<number 输出的还是10进制形式[/quote] 上面已经说了,你堆空间被破坏了,释放的时候会出错
hyykkk 2016-09-10
  • 打赏
  • 举报
回复
引用 8 楼 paschen 的回复:
分配的堆内存使用时越界了,导致堆空间破坏,释放时出错 用new[] delete[]分配足够大小的空间
为什么不加delete p 程序就能运行 再请教一个问题: 请问c++有什么好的将16进制字符串转换为2进制字符串的方法么 为什么用cout<<setbase(2)<<number 输出的还是10进制形式
paschen 版主 2016-09-10
  • 打赏
  • 举报
回复
分配的堆内存使用时越界了,导致堆空间破坏,释放时出错 用new[] delete[]分配足够大小的空间
hyykkk 2016-09-10
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
delete[] p;
为什么不加delete p 程序就能运行 再请教一个问题: 请问c++有什么好的将16进制字符串转换为2进制字符串的方法么 为什么用cout<<setbase(2)<<number 输出的还是10进制形式
hyykkk 2016-09-10
  • 打赏
  • 举报
回复
引用 5 楼 qq_35553864 的回复:
_itoa C语言函数,作用为将整形转换为字符串 int--->char*。你的p申请的空间太少了
请问c++有什么好的将16进制字符串转换为2进制的方法么 为什么用cout<<setbase(2)<<number 输出的还是10进制形式
zhyj_88 2016-09-10
  • 打赏
  • 举报
回复
看一下string中能否自定义插入器,覆盖<<操作符,不行就另定义一个类专门覆盖<<操作符来输出二进制。
阿卡阿卡 2016-09-10
  • 打赏
  • 举报
回复
_itoa C语言函数,作用为将整形转换为字符串 int--->char*。你的p申请的空间太少了
paschen 版主 2016-09-10
  • 打赏
  • 举报
回复
引用 16 楼 hyykkk的回复:
[quote=引用 15 楼 paschen 的回复:] 可以参考:http://www.cnblogs.com/keanuyaoo/p/3297178.html
那如果考虑大整数呢?只能用string来存输入的十进制整数,那应该怎么办[/quote] 一样的原理 string 中 c_str 可以得到char*字符串
hyykkk 2016-09-10
  • 打赏
  • 举报
回复
引用 15 楼 paschen 的回复:
可以参考:http://www.cnblogs.com/keanuyaoo/p/3297178.html
那如果考虑大整数呢?只能用string来存输入的十进制整数,那应该怎么办
2529299417 2016-09-09
  • 打赏
  • 举报
回复
p没分配空间吧,打个比方char *p-new char[2];
赵4老师 2016-09-09
  • 打赏
  • 举报
回复
delete[] p;
赵4老师 2016-09-09
  • 打赏
  • 举报
回复
char *p=new char[40];
加载更多回复(1)

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧