请教关于 operator new 的问题

WIN32SDK_ASM 2014-04-17 01:12:00
代码如下:

int a = strlen(url);
this->url = new char[a+1];
memcpy(this->url, url, strlen(url));


经过单步调试发现 this->url多出来一段内存,说明new的时候多了一段,即非a+1 字节..(我这里是现实112,a==96),太夸张了吧
请问如何解释啊
...全文
152 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
WIN32SDK_ASM 2014-04-17
  • 打赏
  • 举报
回复
引用 1 楼 mougaidong 的回复:
要用strcpy,而非memcpy
确实是这样,理解不能啊
WIN32SDK_ASM 2014-04-17
  • 打赏
  • 举报
回复
引用 3 楼 focuslight 的回复:
char* s = new char[8]; 这样申请的内存,一般以FDFDFDFD开头和结束,只要通过s向后找到FDFDFDFD,就是这块内存的结尾。不过如果s后面的内存也为FDFDFDFD, 长度就会增加 。
这样说的话new出来的内存就不安全了?随机性很大啊
ysnis 2014-04-17
  • 打赏
  • 举报
回复
char* s = new char[8]; 这样申请的内存,一般以FDFDFDFD开头和结束,只要通过s向后找到FDFDFDFD,就是这块内存的结尾。不过如果s后面的内存也为FDFDFDFD, 长度就会增加 。
千树之影 2014-04-17
  • 打赏
  • 举报
回复
你怎么调试出new多了一段的?其实是你越界访问吧?
turing-complete 2014-04-17
  • 打赏
  • 举报
回复
要用strcpy,而非memcpy
WIN32SDK_ASM 2014-04-17
  • 打赏
  • 举报
回复
引用 6 楼 mujiok2003 的回复:
//memcpy(this->url, url, strlen(url));
memcpy(this->url, url, a+1);
恩,应该把'\0'copy过去. 还是用strcpy方便,
unituniverse2 2014-04-17
  • 打赏
  • 举报
回复
strlen算出来的长度没有'\0'结尾的 memcpy不会给你字符串补'\0' new分配出来的内存,里面的内容是随机的,直到你把他改写掉为止 memcpy(this->url, url, strlen(url) + 1);这样 不过这方法搞字符串会被骂的。应该用strcpy(this->url, url)。如果你碰到是宽字符,很容易不留神就把字符长度和字节长度搞混。结果不是缓冲区溢出就是字符串填的不完整。
mujiok2003 2014-04-17
  • 打赏
  • 举报
回复
this->url改成std::string最方便:
this->url = url;
mujiok2003 2014-04-17
  • 打赏
  • 举报
回复
//memcpy(this->url, url, strlen(url));
memcpy(this->url, url, a+1);

65,208

社区成员

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

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